diff --git a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-http/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/http/LookupApiController.java b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-http/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/http/LookupApiController.java index 5fd054a19..43676ef49 100644 --- a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-http/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/http/LookupApiController.java +++ b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice-http/src/main/java/org/eclipse/digitaltwin/basyx/aasdiscoveryservice/http/LookupApiController.java @@ -76,7 +76,7 @@ public ResponseEntity deleteAllAssetLinksById(@Parameter(in = ParameterIn. public ResponseEntity getAllAssetAdministrationShellIdsByAssetLink(@Parameter(in = ParameterIn.QUERY, description = "A list of specific Asset identifiers. Each Asset identifier is a base64-url-encoded [SpecificAssetId](https://api.swaggerhub.com/domains/Plattform_i40/Part1-MetaModel-Schemas/V3.0.1#/components/schemas/SpecificAssetId)" ,schema=@Schema()) @Valid @RequestParam(value = "assetIds", required = false) List assetIds,@Min(1)@Parameter(in = ParameterIn.QUERY, description = "The maximum number of elements in the response array" ,schema=@Schema(allowableValues={ "1" }, minimum="1" )) @Valid @RequestParam(value = "limit", required = false) Integer limit,@Parameter(in = ParameterIn.QUERY, description = "A server-generated identifier retrieved from pagingMetadata that specifies from which position the result listing should continue" ,schema=@Schema()) @Valid @RequestParam(value = "cursor", required = false) String cursor) { - + System.out.println("Reached Here"); if (limit == null) limit = 100; @@ -108,7 +108,8 @@ public ResponseEntity> getAllAssetLinksById(@Parameter(in } public ResponseEntity> postAllAssetLinksById(@Parameter(in = ParameterIn.PATH, description = "The Asset Administration Shell’s unique id (UTF8-BASE64-URL-encoded)", required=true, schema=@Schema()) @PathVariable("aasIdentifier") Base64UrlEncodedIdentifier aasIdentifier,@Parameter(in = ParameterIn.DEFAULT, description = "A list of specific Asset identifiers", required=true, schema=@Schema()) @Valid @RequestBody List body) { - List assetIDs = aasDiscoveryService.createAllAssetLinksById(aasIdentifier.getIdentifier(), body); + System.out.println("Reached Here"); + List assetIDs = aasDiscoveryService.createAllAssetLinksById(aasIdentifier.getIdentifier(), body); return new ResponseEntity>(assetIDs, HttpStatus.CREATED); } diff --git a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice.component/src/main/resources/application.properties b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice.component/src/main/resources/application.properties index 50d1bb1f3..dd52d639d 100644 --- a/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice.component/src/main/resources/application.properties +++ b/basyx.aasdiscoveryservice/basyx.aasdiscoveryservice.component/src/main/resources/application.properties @@ -3,6 +3,7 @@ spring.application.name=AAS Discovery Service basyx.aasdiscoveryservice.name=aas-discovery-service basyx.backend=InMemory +management.endpoints.web.exposure.include=mappings #basyx.backend=MongoDB #spring.data.mongodb.host=127.0.0.1 diff --git a/basyx.common/basyx.client/src/main/java/org/eclipse/digitaltwin/basyx/client/internal/authorization/TokenManager.java b/basyx.common/basyx.client/src/main/java/org/eclipse/digitaltwin/basyx/client/internal/authorization/TokenManager.java index b1a36a0ad..b2165d8a7 100644 --- a/basyx.common/basyx.client/src/main/java/org/eclipse/digitaltwin/basyx/client/internal/authorization/TokenManager.java +++ b/basyx.common/basyx.client/src/main/java/org/eclipse/digitaltwin/basyx/client/internal/authorization/TokenManager.java @@ -34,22 +34,24 @@ import com.nimbusds.oauth2.sdk.token.AccessToken; import com.nimbusds.oauth2.sdk.token.RefreshToken; +import net.minidev.json.JSONObject; + /** * Requests and manages the Access Tokens and Refresh Tokens. * - * @author danish + * @author danish */ public class TokenManager { - - private String tokenEndpoint; - private AccessTokenProvider accessTokenProvider; + + private static final String REFRESH_EXPIRES_IN = "refresh_expires_in"; + private final String tokenEndpoint; + private final AccessTokenProvider accessTokenProvider; private String accessToken; - private String refreshToken; - private long accessTokenExpiryTime; - private long refreshTokenExpiryTime; - + private String refreshToken; + private long accessTokenExpiryTime; + private long refreshTokenExpiryTime; + public TokenManager(String tokenEndpoint, AccessTokenProvider accessTokenProvider) { - super(); this.tokenEndpoint = tokenEndpoint; this.accessTokenProvider = accessTokenProvider; } @@ -61,46 +63,83 @@ public String getTokenEndpoint() { public AccessTokenProvider getAccessTokenProvider() { return this.accessTokenProvider; } - + /** - * Provides access token + * Provides the access token, refreshing it if necessary. * - * @return accessToken + * @return the current valid access token * @throws IOException + * if an error occurs while retrieving the token */ public synchronized String getAccessToken() throws IOException { + long currentTimeMillis = System.currentTimeMillis(); - if (accessToken != null && System.currentTimeMillis() < accessTokenExpiryTime) - return accessToken; + if (accessToken != null && currentTimeMillis < accessTokenExpiryTime) { + return accessToken; + } - if (refreshToken != null && System.currentTimeMillis() < refreshTokenExpiryTime) { - try { - return requestAccessToken(accessTokenProvider.getAccessTokenResponse(tokenEndpoint, refreshToken)); + if (refreshToken != null && currentTimeMillis < refreshTokenExpiryTime) { + try { + return updateTokens(accessTokenProvider.getAccessTokenResponse(tokenEndpoint, refreshToken), currentTimeMillis); } catch (IOException e) { - throw new AccessTokenRetrievalException("Error occurred while retrieving access token" + e.getMessage()); + throw new AccessTokenRetrievalException("Error occurred while retrieving access token: " + e.getMessage()); } - } + } - try { - return requestAccessToken(accessTokenProvider.getAccessTokenResponse(tokenEndpoint)); + try { + return updateTokens(accessTokenProvider.getAccessTokenResponse(tokenEndpoint), currentTimeMillis); } catch (IOException e) { - throw new AccessTokenRetrievalException("Error occurred while retrieving access token" + e.getMessage()); + throw new AccessTokenRetrievalException("Error occurred while retrieving access token: " + e.getMessage()); } - } - - private String requestAccessToken(AccessTokenResponse accessTokenResponse) throws IOException { - AccessToken accessTokenObj = accessTokenResponse.getTokens().getAccessToken(); - accessToken = accessTokenObj.getValue(); - accessTokenExpiryTime = accessTokenObj.getLifetime(); - - RefreshToken refreshTokenObj = accessTokenResponse.getTokens().getRefreshToken(); - - if (refreshTokenObj != null) { - refreshToken = refreshTokenObj.getValue(); - refreshTokenExpiryTime = System.currentTimeMillis() + (30L * 24L * 60L * 60L * 1000L); - } - - return accessToken; - } - -} + } + + /** + * Updates the tokens and their expiry times. + * + * @param accessTokenResponse + * the response containing the new tokens + * @param currentTimeMillis + * the current timestamp in milliseconds for consistency + * @return the new access token + * @throws IOException + * if an error occurs while processing the response + */ + private String updateTokens(AccessTokenResponse accessTokenResponse, long currentTimeMillis) throws IOException { + AccessToken accessTokenObj = accessTokenResponse.getTokens().getAccessToken(); + accessToken = accessTokenObj.getValue(); + accessTokenExpiryTime = currentTimeMillis + convertToMilliseconds(accessTokenObj.getLifetime()); + + RefreshToken refreshTokenObj = accessTokenResponse.getTokens().getRefreshToken(); + + if (refreshTokenObj != null) { + refreshToken = refreshTokenObj.getValue(); + refreshTokenExpiryTime = calculateRefreshTokenExpiry(accessTokenResponse, currentTimeMillis); + } + + return accessToken; + } + + /** + * Extracts the refresh token's expiry time from the response. + * + * @param accessTokenResponse + * the response containing the refresh token + * @param currentTimeMillis + * the current timestamp in milliseconds for consistency + * @return the expiry time in epoch millis, or 0 if not available + */ + private long calculateRefreshTokenExpiry(AccessTokenResponse accessTokenResponse, long currentTimeMillis) { + JSONObject jsonObject = accessTokenResponse.toJSONObject(); + Number refreshExpiresInSeconds = jsonObject.getAsNumber(REFRESH_EXPIRES_IN); + + if (refreshExpiresInSeconds == null) { + return 0; + } + + return currentTimeMillis + convertToMilliseconds(refreshExpiresInSeconds.longValue()); + } + + private long convertToMilliseconds(long refreshExpiresInSeconds) { + return refreshExpiresInSeconds * 1000L; + } +} \ No newline at end of file diff --git a/basyx.common/basyx.http/src/main/java/org/eclipse/digitaltwin/basyx/http/description/DescriptionController.java b/basyx.common/basyx.http/src/main/java/org/eclipse/digitaltwin/basyx/http/description/DescriptionController.java index 79c906f36..e36dec074 100644 --- a/basyx.common/basyx.http/src/main/java/org/eclipse/digitaltwin/basyx/http/description/DescriptionController.java +++ b/basyx.common/basyx.http/src/main/java/org/eclipse/digitaltwin/basyx/http/description/DescriptionController.java @@ -34,7 +34,7 @@ public DescriptionController(List declarations) { } } - @Operation(operationId = "getDescription", + @Operation(operationId = "getDescriptions", summary = "Returns the self-describing information of a network resource (ServiceDescription)", tags = {"Registry and Discovery Interface"}, responses = { @ApiResponse(responseCode = "200", description = "Requested Description", content = { @@ -43,8 +43,8 @@ public DescriptionController(List declarations) { content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))}), @ApiResponse(responseCode = "default", description = "Default error handling for unmentioned status codes", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))})}) - @RequestMapping(method = RequestMethod.GET, value = "/description", produces = {"application/json"}) - public ResponseEntity getDescription() { + @RequestMapping(method = RequestMethod.GET, value = "/descriptions", produces = {"application/json"}) + public ResponseEntity getDescriptions() { ServiceDescription serviceDescription = new ServiceDescription(); serviceDescription.profiles(new ArrayList<>(profiles)); return new ResponseEntity<>(serviceDescription, HttpStatus.OK); diff --git a/basyx.digitaltwinregistry/Readme.md b/basyx.digitaltwinregistry/Readme.md new file mode 100644 index 000000000..5e7c4a108 --- /dev/null +++ b/basyx.digitaltwinregistry/Readme.md @@ -0,0 +1,69 @@ +# Eclipse BaSyx - AAS Environment +Eclipse BaSyx provides the AAS Environment as off-the-shelf component: + + docker run --name=aas-env -p:8081:8081 -v C:/tmp/application.properties:/application/application.properties eclipsebasyx/aas-environment:2.0.0-SNAPSHOT + +> *Disclaimer*: In this example, configuration files are located in `C:/tmp` + +> *Disclaimer*: The binding of volume `C:/tmp/application.properties` to `/application/application.properties` is tested using Windows Powershell. Other terminals might run into an error. + +It aggregates the AAS Repository, Submodel Repository and ConceptDescription Repository into a single component. For its features and configuration, see the documentation of the respective components. + +In addition, it supports the following endpoint defined in DotAAS Part 2 V3 - Serialization Interface: +- GenerateSerializationByIds. For more information about this endpoint please refer to [Swagger API](https://app.swaggerhub.com/apis/Plattform_i40/Entire-API-Collection/V3.0.1#/Serialization%20API/GenerateSerializationByIds) + +The Aggregated API endpoint documentation is available at: + + http://{host}:{port}/v3/api-docs + +The Aggregated Swagger UI for the endpoint is available at: + + http://{host}:{port}/swagger-ui/index.html + +For a configuration example, see [application.properties](./basyx.aasenvironment.component/src/main/resources/application.properties) +The Health Endpoint and CORS Documentation can be found [here](../docs/Readme.md). + +## Preconfiguration of AAS Environments +The AAS Environment Component supports the preconfiguration of AAS Environments (e.g., XML, JSON, AASX) via the _basyx.environment_ parameter. + +The feature supports both preconfiguring explicit files (e.g., file:myDevice.aasx) as well as directories (e.g., file:myDirectory) that will be recursively scanned for serialized environments. + +Please note that collision of ids of Submodels and AAS in the preconfigured environments will lead to an error. For ConceptDescriptions, however, id collisions are ignored since they are assumed to be identical. Thus, only the first occurance of a ConceptDescription with the same Id will be uploaded. Further ConceptDescriptions with the same Id will only lead to a warning in the log. + +Furthermore, if Identifiables (AAS, Submodels, ConceptDescriptions) are already existing in the repositories before adding the preconfigured environments (e.g., due to using MongoDB persistency and restarting the server), the _Version_ & _Revision_ (cf. AdministrativeInformation) are leveraged for determining if the existing Identifiables should be overwritten. The following examples illustrate this behavior: +* Preconfigured Identifiable has same version and same revision in comparison to the already existing => No overwriting +* Preconfigured Identifiable has older version or same version and older revision in comparison to the already existing => No overwriting +* Preconfigured Identifiable has newer version or same version but newer revision in comparison to the already existing => Server version is overwritten + + +For examples, see [application.properties](./basyx.aasenvironment.component/src/main/resources/application.properties) + +## AAS Environment Upload Endpoint + +AAS environments (e.g. XML, JSON, AASX) can be uploaded by a multipart/form-data POST on the `/upload` endpoint. Please note that the following MIME types as **Accept Header** are expected for the respective file uploads: +* AASX: application/asset-administration-shell-package +* JSON: application/json +* XML: application/xml + +Below is an example curl request: + +``` +curl --location 'http://localhost:8081/upload' \ +--header 'Accept: application/asset-administration-shell-package' \ +--form 'file=@"Sample.aasx"' + +``` + +The upload follows the same rules as the preconfiguration in terms of handling existing AAS, submodels and concept descriptions. In order for the file to be recognized correctly, please make sure that its MIME type is properly configured. + +**Note** +If the AAS Environment file (XML, JSON, or AASX) size exceeds the below mentioned default limit, it is important to set the below two properties in the application.properties based on the size of the file to be uploaded: + + spring.servlet.multipart.max-file-size (default 1 MB) + spring.servlet.multipart.max-request-size (default 10 MB) + +## AAS Environment Features +* [AAS Environment Authorization](basyx.aasenvironment-feature-authorization) + +## Configure Favicon +To configure the favicon, add the favicon.ico to [basyx-java-server-sdk\basyx.common\basyx.http\src\main\resources\static](../basyx.common/basyx.http/src/main/resources/static/). diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/pom.xml b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/pom.xml new file mode 100644 index 000000000..74dfe5b1b --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/pom.xml @@ -0,0 +1,81 @@ + + 4.0.0 + + + org.eclipse.digitaltwin.basyx + basyx.digitaltwinregistry + ${revision} + + + basyx.digitaltwinregistry-http + BaSyx AAS Environment HTTP + BaSyx AAS Environment HTTP + + + + org.eclipse.digitaltwin.basyx + basyx.http + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-http + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service + + + org.eclipse.digitaltwin.basyx + basyx.http + test + tests + + + org.springframework + spring-context + + + org.springframework.boot + spring-boot-starter-web + + + ch.qos.logback + logback-classic + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + + + jakarta.validation + jakarta.validation-api + + + org.eclipse.digitaltwin.aas4j + aas4j-dataformat-json + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-simple + test + + + org.apache.httpcomponents.client5 + httpclient5 + test + + + commons-io + commons-io + test + + + diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AASEnvironmentConfiguration.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AASEnvironmentConfiguration.java new file mode 100644 index 000000000..eed49a3ff --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AASEnvironmentConfiguration.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (C) 2023 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.http; + +import org.eclipse.digitaltwin.basyx.http.CorsPathPatternProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * + * @author schnicke + * + */ +@Configuration +public class AASEnvironmentConfiguration { + + @Bean + public CorsPathPatternProvider getAASEnvironmentSerializationRepoCorsUrlProvider() { + return new CorsPathPatternProvider("/serialization"); + } + + @Bean + public CorsPathPatternProvider getAASEnvironmentUploadRepoCorsUrlProvider() { + return new CorsPathPatternProvider("/upload"); + } +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AASEnvironmentHTTPApi.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AASEnvironmentHTTPApi.java new file mode 100644 index 000000000..cb8bdf376 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AASEnvironmentHTTPApi.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (C) 2023 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.http; + +import java.util.List; + +import org.eclipse.digitaltwin.aas4j.v3.model.Result; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.validation.Valid; + +@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2023-05-08T12:36:05.278579031Z[GMT]") +@Validated +public interface AASEnvironmentHTTPApi { + + @Operation(summary = "Returns an appropriate serialization based on the specified format (see SerializationFormat)", description = "", tags = { "Serialization API" }) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Requested serialization based on SerializationFormat", content = @Content(mediaType = "application/asset-administration-shell-package+xml", schema = @Schema(implementation = Resource.class))), + + @ApiResponse(responseCode = "400", description = "Bad Request, e.g. the request parameters of the format of the request body is wrong.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))), + + @ApiResponse(responseCode = "401", description = "Unauthorized, e.g. the server refused the authorization attempt.", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))), + + @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))), + + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))), + + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))), + + @ApiResponse(responseCode = "200", description = "Default error handling for unmentioned status codes", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Result.class))) }) + @RequestMapping(value = "/serialization", produces = { "application/asset-administration-shell-package+xml", "application/json", "application/xml" }, method = RequestMethod.GET) + ResponseEntity generateSerializationByIds( + @Parameter(in = ParameterIn.QUERY, description = "The Asset Administration Shells' unique ids (UTF8-BASE64-URL-encoded)", schema = @Schema()) @Valid @RequestParam(value = "aasIds", required = false) List aasIds, + @Parameter(in = ParameterIn.QUERY, description = "The Submodels' unique ids (UTF8-BASE64-URL-encoded)", schema = @Schema()) @Valid @RequestParam(value = "submodelIds", required = false) List submodelIds, + @Parameter(in = ParameterIn.QUERY, description = "Include Concept Descriptions?", schema = @Schema(defaultValue = "true")) @Valid @RequestParam(value = "includeConceptDescriptions", required = false, defaultValue = "true") Boolean includeConceptDescriptions); + + + @Operation(summary = "Upload an environment file (XML, JSON, AASX)", description = "Uploads an environment file for processing.", tags = { "Environment API" }) + @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Environment successfully processed", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Boolean.class))), + @ApiResponse(responseCode = "400", description = "Bad Request, invalid file format or structure", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Boolean.class))), + @ApiResponse(responseCode = "500", description = "Internal Server Error, processing failure", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Boolean.class))) }) + @RequestMapping(value = "/upload", method = RequestMethod.POST) + ResponseEntity uploadEnvironment(@Parameter(description = "An environment file (XML, JSON, AASX)") @Valid @RequestParam("file") MultipartFile envFile); +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AasEnvironmentApiHTTPController.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AasEnvironmentApiHTTPController.java new file mode 100644 index 000000000..00298085d --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/AasEnvironmentApiHTTPController.java @@ -0,0 +1,145 @@ +/******************************************************************************* + * Copyright (C) 2023 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.http; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.DeserializationException; +import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.SerializationException; +import org.eclipse.digitaltwin.basyx.aasenvironment.AasEnvironment; +import org.eclipse.digitaltwin.basyx.aasenvironment.environmentloader.CompleteEnvironment; +import org.eclipse.digitaltwin.basyx.aasenvironment.environmentloader.CompleteEnvironment.EnvironmentType; +import org.eclipse.digitaltwin.basyx.core.exceptions.ElementDoesNotExistException; +import org.eclipse.digitaltwin.basyx.http.Base64UrlEncodedIdentifier; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; + +@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2023-05-08T12:36:05.278579031Z[GMT]") +@RestController +public class AasEnvironmentApiHTTPController implements AASEnvironmentHTTPApi { + + private static final String ACCEPT_JSON = "application/json"; + private static final String ACCEPT_XML = "application/xml"; + private static final String ACCEPT_AASX = "application/asset-administration-shell-package+xml"; + + private final HttpServletRequest request; + + private final AasEnvironment aasEnvironment; + + @Autowired + public AasEnvironmentApiHTTPController(HttpServletRequest request, AasEnvironment aasEnvironment) { + this.request = request; + this.aasEnvironment = aasEnvironment; + } + + @Override + public ResponseEntity generateSerializationByIds( + @Parameter(in = ParameterIn.QUERY, description = "The Asset Administration Shells' unique ids (UTF8-BASE64-URL-encoded)", schema = @Schema()) @Valid @RequestParam(value = "aasIds", required = false) List aasIds, + @Parameter(in = ParameterIn.QUERY, description = "The Submodels' unique ids (UTF8-BASE64-URL-encoded)", schema = @Schema()) @Valid @RequestParam(value = "submodelIds", required = false) List submodelIds, + @Parameter(in = ParameterIn.QUERY, description = "Include Concept Descriptions?", schema = @Schema(defaultValue = "true")) @Valid @RequestParam(value = "includeConceptDescriptions", required = false, defaultValue = "true") Boolean includeConceptDescriptions) { + String accept = request.getHeader("Accept"); + + if (!areParametersValid(accept, aasIds, submodelIds)) { + return new ResponseEntity(HttpStatus.BAD_REQUEST); + } + + try { + if (accept.equals(ACCEPT_AASX)) { + byte[] serialization = aasEnvironment.createAASXAASEnvironmentSerialization(getOriginalIds(aasIds), getOriginalIds(submodelIds), includeConceptDescriptions); + return new ResponseEntity(new ByteArrayResource(serialization), HttpStatus.OK); + } + + if (accept.equals(ACCEPT_XML)) { + String serialization = aasEnvironment.createXMLAASEnvironmentSerialization(getOriginalIds(aasIds), getOriginalIds(submodelIds), includeConceptDescriptions); + return new ResponseEntity(new ByteArrayResource(serialization.getBytes()), HttpStatus.OK); + } + + String serialization = aasEnvironment.createJSONAASEnvironmentSerialization(getOriginalIds(aasIds), getOriginalIds(submodelIds), includeConceptDescriptions); + return new ResponseEntity(new ByteArrayResource(serialization.getBytes()), HttpStatus.OK); + } catch (ElementDoesNotExistException e) { + return new ResponseEntity(HttpStatus.NOT_FOUND); + } catch (SerializationException | IOException e) { + return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Override + public ResponseEntity uploadEnvironment(MultipartFile envFile) { + try { + EnvironmentType envType = EnvironmentType.getFromMimeType(envFile.getContentType()); + + if (envType == null) + envType = EnvironmentType.AASX; + + aasEnvironment.loadEnvironment(CompleteEnvironment.fromInputStream(envFile.getInputStream(), envType)); + + } catch (InvalidFormatException e) { + return new ResponseEntity(false, HttpStatus.BAD_REQUEST); + } catch (DeserializationException | IOException e) { + return new ResponseEntity(false, HttpStatus.INTERNAL_SERVER_ERROR); + } + return new ResponseEntity(true, HttpStatus.OK); + } + + private List getOriginalIds(List ids) { + List results = new ArrayList<>(); + + if (!areValidIds(ids)) + return results; + + ids.forEach(id -> { + results.add(Base64UrlEncodedIdentifier.fromEncodedValue(id).getIdentifier()); + }); + + return results; + } + + private boolean areParametersValid(String accept, @Valid List aasIds, @Valid List submodelIds) { + if (!areValidIds(aasIds) && !areValidIds(submodelIds)) + return false; + + return (accept.equals(ACCEPT_AASX) || accept.equals(ACCEPT_JSON) || accept.equals(ACCEPT_XML)); + } + + private boolean areValidIds(List identifiers) { + return identifiers != null && !identifiers.isEmpty(); + } +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/DummyAASEnvironmentComponent.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/DummyAASEnvironmentComponent.java new file mode 100644 index 000000000..fc307917c --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/DummyAASEnvironmentComponent.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (C) 2023 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.http; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.eclipse.digitaltwin.aas4j.v3.model.AssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.AssetKind; +import org.eclipse.digitaltwin.aas4j.v3.model.ConceptDescription; +import org.eclipse.digitaltwin.aas4j.v3.model.Submodel; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetAdministrationShell; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultAssetInformation; +import org.eclipse.digitaltwin.aas4j.v3.model.impl.DefaultConceptDescription; +import org.eclipse.digitaltwin.basyx.aasenvironment.AasEnvironment; +import org.eclipse.digitaltwin.basyx.aasenvironment.base.DefaultAASEnvironment; +import org.eclipse.digitaltwin.basyx.aasenvironment.preconfiguration.AasEnvironmentPreconfigurationLoader; +import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository; +import org.eclipse.digitaltwin.basyx.conceptdescriptionrepository.ConceptDescriptionRepository; +import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository; +import org.eclipse.digitaltwin.basyx.submodelservice.DummySubmodelFactory; +import org.eclipse.digitaltwin.basyx.submodelservice.SubmodelServiceHelper; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.core.io.ResourceLoader; + +@SpringBootApplication(scanBasePackages = "org.eclipse.digitaltwin.basyx") +public class DummyAASEnvironmentComponent { + public static final String AAS_TECHNICAL_DATA_ID = "shell001"; + public static final String AAS_OPERATIONAL_DATA_ID = "shell002"; + public static final String SUBMODEL_TECHNICAL_DATA_ID = "7A7104BDAB57E184"; + public static final String SUBMODEL_OPERATIONAL_DATA_ID = "AC69B1CB44F07935"; + public static final String CONCEPT_DESCRIPTION_ID_NOT_INCLUDED_IN_ENV = "IdNotToBeIncludedInSerializedEnv"; + + @Bean + public AasEnvironment createAasEnvironmentSerialization(AasRepository aasRepository, SubmodelRepository submodelRepository, ConceptDescriptionRepository conceptDescriptionRepository) { + initRepositories(aasRepository, submodelRepository, conceptDescriptionRepository); + return new DefaultAASEnvironment(aasRepository, submodelRepository, conceptDescriptionRepository); + } + + @Bean + public AasEnvironmentPreconfigurationLoader createAasEnvironmentPreconfigurationLoader(ResourceLoader resourceLoader, List pathsToLoad) { + return new AasEnvironmentPreconfigurationLoader(resourceLoader, pathsToLoad); + } + + public void initRepositories(AasRepository aasRepository, SubmodelRepository submodelRepository, ConceptDescriptionRepository conceptDescriptionRepository) { + createDummySubmodels().forEach(submodelRepository::createSubmodel); + createDummyShells().forEach(aasRepository::createAas); + createDummyConceptDescriptions().forEach(conceptDescriptionRepository::createConceptDescription); + } + + private Collection createDummySubmodels() { + Collection submodels = new ArrayList<>(); + submodels.add(DummySubmodelFactory.createOperationalDataSubmodel()); + submodels.add(DummySubmodelFactory.createTechnicalDataSubmodel()); + return submodels; + } + + private Collection createDummyShells() { + AssetAdministrationShell shell1 = new DefaultAssetAdministrationShell.Builder().id(AAS_TECHNICAL_DATA_ID).idShort(AAS_TECHNICAL_DATA_ID) + .assetInformation(new DefaultAssetInformation.Builder().assetKind(AssetKind.INSTANCE).globalAssetId(SUBMODEL_TECHNICAL_DATA_ID).build()).build(); + + AssetAdministrationShell shell2 = new DefaultAssetAdministrationShell.Builder().id(AAS_OPERATIONAL_DATA_ID).idShort(AAS_OPERATIONAL_DATA_ID) + .assetInformation(new DefaultAssetInformation.Builder().assetKind(AssetKind.INSTANCE).globalAssetId(AAS_OPERATIONAL_DATA_ID).build()).build(); + Collection shells = new ArrayList<>(); + shells.add(shell1); + shells.add(shell2); + return shells; + } + + private static Collection createDummyConceptDescriptions() { + Collection conceptDescriptions = new ArrayList<>(); + + conceptDescriptions.add(new DefaultConceptDescription.Builder().id(SubmodelServiceHelper.SUBMODEL_TECHNICAL_DATA_SEMANTIC_ID_PROPERTY).build()); + conceptDescriptions.add(new DefaultConceptDescription.Builder().id(DummySubmodelFactory.SUBMODEL_OPERATIONAL_DATA_SEMANTIC_ID_PROPERTY).build()); + conceptDescriptions.add(new DefaultConceptDescription.Builder().id(CONCEPT_DESCRIPTION_ID_NOT_INCLUDED_IN_ENV).build()); + + return conceptDescriptions; + } + +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/TestAasEnvironmentHTTP.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/TestAasEnvironmentHTTP.java new file mode 100644 index 000000000..600c56470 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/http/TestAasEnvironmentHTTP.java @@ -0,0 +1,353 @@ +/******************************************************************************* + * Copyright (C) 2024 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.http; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.core5.http.ParseException; +import org.apache.hc.core5.http.ProtocolException; +import org.apache.poi.openxml4j.exceptions.InvalidFormatException; +import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.DeserializationException; +import org.eclipse.digitaltwin.basyx.aasenvironment.TestAASEnvironmentSerialization; +import org.eclipse.digitaltwin.basyx.aasrepository.AasRepository; +import org.eclipse.digitaltwin.basyx.conceptdescriptionrepository.ConceptDescriptionRepository; +import org.eclipse.digitaltwin.basyx.http.Base64UrlEncodedIdentifier; +import org.eclipse.digitaltwin.basyx.http.HttpBaSyxHeader; +import org.eclipse.digitaltwin.basyx.http.serialization.BaSyxHttpTestUtils; +import org.eclipse.digitaltwin.basyx.submodelrepository.SubmodelRepository; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.boot.SpringApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.http.HttpStatus; +import org.springframework.util.ResourceUtils; + +public class TestAasEnvironmentHTTP { + + public static final String JSON_MIMETYPE = "application/json"; + public static final String XML_MIMETYPE = "application/xml"; + public static final String AASX_MIMETYPE = "application/asset-administration-shell-package+xml"; + + public static final String AASX_ENV_PATH = "testEnvironment.aasx"; + private static final String JSON_ENV_PATH = "testEnvironment.json"; + private static final String XML_ENV_PATH = "testEnvironment.xml"; + private static final String WRONGEXT_ENV_PATH = "testEnvironment.txt"; + private static final String JSON_OPERATIONALDATA_ENV_PATH = "operationalDataEnvironment.json"; + private static final String AASENVIRONMENT_VALUE_ONLY_JSON = "AASEnvironmentValueOnly.json"; + + private static ConfigurableApplicationContext appContext; + private static SubmodelRepository submodelRepo; + private static AasRepository aasRepo; + private static ConceptDescriptionRepository conceptDescriptionRepo; + + @BeforeClass + public static void startAasRepo() throws Exception { + appContext = new SpringApplication(DummyAASEnvironmentComponent.class).run(new String[] {}); + submodelRepo = appContext.getBean(SubmodelRepository.class); + aasRepo = appContext.getBean(AasRepository.class); + conceptDescriptionRepo = appContext.getBean(ConceptDescriptionRepository.class); + } + + @Test + public void baSyxResponseHeader() throws IOException, ProtocolException { + CloseableHttpResponse response = BaSyxHttpTestUtils.executeGetOnURL(getURL()); + assertEquals(HttpBaSyxHeader.HEADER_VALUE, response.getHeader(HttpBaSyxHeader.HEADER_KEY).getValue()); + } + + @Test + public void testAASEnvironmentSertializationWithJSON() throws IOException, ParseException, DeserializationException { + boolean includeConceptDescription = true; + boolean aasIdsIncluded = true; + boolean submodelIdsIncluded = true; + + CloseableHttpResponse response = executeGetOnURL(createSerializationURL(includeConceptDescription), JSON_MIMETYPE); + String actual = BaSyxHttpTestUtils.getResponseAsString(response); + TestAASEnvironmentSerialization.validateJSON(actual, aasIdsIncluded, submodelIdsIncluded, includeConceptDescription); + } + + @Test + public void testAASEnvironmentSerialization_ValueOnly() throws FileNotFoundException, IOException, ParseException { + CloseableHttpResponse response = BaSyxHttpTestUtils.executePostRequest(HttpClients.createDefault(), createPostRequestWithFile(JSON_OPERATIONALDATA_ENV_PATH, JSON_MIMETYPE)); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + response = executeGetOnURL(getOperationalDataValueOnlyURL(), JSON_MIMETYPE); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + BaSyxHttpTestUtils.assertSameJSONContent(BaSyxHttpTestUtils.readJSONStringFromClasspath(AASENVIRONMENT_VALUE_ONLY_JSON), BaSyxHttpTestUtils.getResponseAsString(response)); + } + + @Test + public void testAASEnvironmentSertializationWithXML() throws IOException, ParseException, DeserializationException { + boolean includeConceptDescription = true; + boolean aasIdsIncluded = true; + boolean submodelIdsIncluded = true; + + CloseableHttpResponse response = executeGetOnURL(createSerializationURL(includeConceptDescription), XML_MIMETYPE); + String actual = BaSyxHttpTestUtils.getResponseAsString(response); + TestAASEnvironmentSerialization.validateXml(actual, aasIdsIncluded, submodelIdsIncluded, includeConceptDescription); + } + + @Test + public void testAASEnvironmentSertializationWithAASX() throws IOException, ParseException, DeserializationException, InvalidFormatException { + boolean includeConceptDescription = true; + boolean aasIdsIncluded = true; + boolean submodelIdsIncluded = true; + + CloseableHttpResponse response = executeGetOnURL(createSerializationURL(includeConceptDescription), AASX_MIMETYPE); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + TestAASEnvironmentSerialization.checkAASX(response.getEntity().getContent(), aasIdsIncluded, submodelIdsIncluded, includeConceptDescription); + } + + @Test + public void testAASEnvironmentSertializationWithAASXAndFiles() throws IOException, ParseException, DeserializationException, InvalidFormatException { + CloseableHttpResponse response = executeGetOnURL(createSerializationURLForFiles(), AASX_MIMETYPE); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + TestAASEnvironmentSerialization.checkAASXFiles(response.getEntity().getContent()); + } + + @Test + public void testAASEnvironmentSertializationWithAASXExcludeCD() throws IOException, ParseException, DeserializationException, InvalidFormatException { + boolean includeConceptDescription = false; + boolean aasIdsIncluded = true; + boolean submodelIdsIncluded = true; + + CloseableHttpResponse response = executeGetOnURL(createSerializationURL(includeConceptDescription), AASX_MIMETYPE); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + TestAASEnvironmentSerialization.checkAASX(response.getEntity().getContent(), aasIdsIncluded, submodelIdsIncluded, includeConceptDescription); + } + + @Test + public void aasEnvironmentSertializationOnlyAasIds() throws IOException, ParseException, DeserializationException { + boolean includeConceptDescription = false; + boolean aasIdsIncluded = true; + boolean submodelIdsIncluded = false; + + CloseableHttpResponse response = executeGetOnURL(getSerializationURLOnlyAas(createIdCollection(DummyAASEnvironmentComponent.AAS_TECHNICAL_DATA_ID, DummyAASEnvironmentComponent.AAS_OPERATIONAL_DATA_ID), includeConceptDescription), JSON_MIMETYPE); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + String actual = BaSyxHttpTestUtils.getResponseAsString(response); + TestAASEnvironmentSerialization.validateJSON(actual, aasIdsIncluded, submodelIdsIncluded, includeConceptDescription); + } + + @Test + public void aasEnvironmentSertializationOnlySubmodelIds() throws IOException, ParseException, DeserializationException { + boolean includeConceptDescription = true; + boolean aasIdsIncluded = false; + boolean submodelIdsIncluded = true; + + CloseableHttpResponse response = executeGetOnURL(getSerializationURLOnlySubmodels(createIdCollection(DummyAASEnvironmentComponent.SUBMODEL_OPERATIONAL_DATA_ID, DummyAASEnvironmentComponent.SUBMODEL_TECHNICAL_DATA_ID), includeConceptDescription), JSON_MIMETYPE); + assertEquals(HttpStatus.OK.value(), response.getCode()); + + String actual = BaSyxHttpTestUtils.getResponseAsString(response); + TestAASEnvironmentSerialization.validateJSON(actual, aasIdsIncluded, submodelIdsIncluded, includeConceptDescription); + } + + @Test + public void testAASEnvironmentWithWrongParameter() throws IOException { + boolean includeConceptDescription = true; + + CloseableHttpResponse response = executeGetOnURL(getSerializationURL(new ArrayList(), new ArrayList(), includeConceptDescription), JSON_MIMETYPE); + assertEquals(HttpStatus.BAD_REQUEST.value(), response.getCode()); + } + + @Test + public void testAASEnvironmentWithWrongAcceptHeader() throws IOException { + boolean includeConceptDescription = true; + + CloseableHttpResponse response = executeGetOnURL(getSerializationURL(new ArrayList(), new ArrayList(), includeConceptDescription), ""); + assertEquals(HttpStatus.BAD_REQUEST.value(), response.getCode()); + } + + @Test + public void testAASEnvironmentWithWrongId() throws IOException { + boolean includeConceptDescription = true; + + List aasIds = new ArrayList<>(); + List submodelIds = new ArrayList<>(); + + aasIds.add("wrongAasId"); + submodelIds.add("wrongSubmodelId"); + CloseableHttpResponse response = executeGetOnURL(getSerializationURL(aasIds, submodelIds, includeConceptDescription), JSON_MIMETYPE); + assertEquals(HttpStatus.NOT_FOUND.value(), response.getCode()); + } + + @Test + public void testEnvironmentUpload_AASX() throws IOException, InvalidFormatException, UnsupportedOperationException, DeserializationException, ParseException { + CloseableHttpResponse response = BaSyxHttpTestUtils.executePostRequest(HttpClients.createDefault(), createPostRequestWithFile(AASX_ENV_PATH, AASX_MIMETYPE)); + + assertEquals(HttpStatus.OK.value(), response.getCode()); + + assertNotNull(aasRepo.getAas("http://customer.com/aas/9175_7013_7091_9168")); + assertNotNull(submodelRepo.getSubmodel("http://i40.customer.com/type/1/1/7A7104BDAB57E184")); + assertNotNull(conceptDescriptionRepo.getConceptDescription("http://www.vdi2770.com/blatt1/Entwurf/Okt18/cd/Description/Title")); + } + + @Test + public void testEnvironmentUpload_JSON() throws IOException, InvalidFormatException, UnsupportedOperationException, DeserializationException, ParseException { + CloseableHttpResponse response = BaSyxHttpTestUtils.executePostRequest(HttpClients.createDefault(), createPostRequestWithFile(JSON_ENV_PATH, JSON_MIMETYPE)); + + assertEquals(HttpStatus.OK.value(), response.getCode()); + + assertNotNull(aasRepo.getAas("https://acplt.test/Test_AssetAdministrationShell")); + assertNotNull(submodelRepo.getSubmodel("http://acplt.test/Submodels/Assets/TestAsset/Identification")); + assertNotNull(conceptDescriptionRepo.getConceptDescription("https://acplt.test/Test_ConceptDescription")); + } + + @Test + public void testEnvironmentUpload_XML() throws IOException, InvalidFormatException, UnsupportedOperationException, DeserializationException, ParseException { + CloseableHttpResponse response = BaSyxHttpTestUtils.executePostRequest(HttpClients.createDefault(), createPostRequestWithFile(XML_ENV_PATH, XML_MIMETYPE)); + + assertEquals(HttpStatus.OK.value(), response.getCode()); + + assertNotNull(aasRepo.getAas("http://customer.test/aas/9175_7013_7091_9168")); + assertNotNull(submodelRepo.getSubmodel("http://i40.customer.test/type/1/1/7A7104BDAB57E184")); + assertNotNull(conceptDescriptionRepo.getConceptDescription("http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Description/Title")); + } + + @Test + public void testEnvironmentUpload_WrongExtension() throws IOException, InvalidFormatException, UnsupportedOperationException, DeserializationException, ParseException { + CloseableHttpResponse response = BaSyxHttpTestUtils.executePostRequest(HttpClients.createDefault(), createPostRequestWithFile(WRONGEXT_ENV_PATH, "text/plain")); + + assertEquals(HttpStatus.BAD_REQUEST.value(), response.getCode()); + } + + public static String createSerializationURL(boolean includeConceptDescription) { + return getSerializationURL(createIdCollection(DummyAASEnvironmentComponent.AAS_TECHNICAL_DATA_ID, DummyAASEnvironmentComponent.AAS_OPERATIONAL_DATA_ID), + createIdCollection(DummyAASEnvironmentComponent.SUBMODEL_OPERATIONAL_DATA_ID, DummyAASEnvironmentComponent.SUBMODEL_TECHNICAL_DATA_ID), includeConceptDescription); + } + + public static String createSerializationURLForFiles() { + return getSerializationURL(createIdCollection("https://example.com/ids/AssetAdministrationShell/3982_3381_6308_9332"), + createIdCollection("https://example.com/ids/Submodel/3293_1019_6578_9120"), false); + } + + public static CloseableHttpResponse executeGetOnURL(String url, String header) throws IOException { + CloseableHttpClient client = HttpClients.createDefault(); + HttpGet getRequest = createGetRequestWithHeader(url, header); + return client.execute(getRequest); + } + + private static HttpGet createGetRequestWithHeader(String url, String header) { + HttpGet aasCreateRequest = new HttpGet(url); + aasCreateRequest.setHeader("Accept", header); + return aasCreateRequest; + } + + private static HttpPost createPostRequestWithFile(String filepath, String contentType) throws FileNotFoundException { + java.io.File file = ResourceUtils.getFile("classpath:" + filepath); + + return BaSyxHttpTestUtils.createPostRequestWithFile(getAASXUploadURL(), file, contentType); + } + + public static String getURL() { + return "http://localhost:8081"; + } + + private static String getAASXUploadURL() { + return getURL() + "/upload"; + } + + public static String getOperationalDataValueOnlyURL() { + return getURL() + "/submodels/d3d3LmV4YW1wbGUuY29tL2lkcy9zbS8yMjIyXzgwNDFfMTA0Ml84MDU3/$value"; + } + + public static String getSerializationURL(Collection aasIds, Collection submodelIds, boolean includeConceptDescription) { + String aasIdsArrayString = createIdsArrayString(aasIds); + String submodelIdsArrayString = createIdsArrayString(submodelIds); + + return getURL() + "/serialization?" + getAasIdsParameter(aasIdsArrayString) + "&" + getSubmodelIdsParameter(submodelIdsArrayString) + "&includeConceptDescriptions=" + includeConceptDescription; + } + + private static String getSerializationURLOnlyAas(Collection aasIds, boolean includeConceptDescription) { + String aasIdsArrayString = createIdsArrayString(aasIds); + + return getURL() + "/serialization?" + getAasIdsParameter(aasIdsArrayString) + "&includeConceptDescriptions=" + includeConceptDescription; + } + + private static String getSerializationURLOnlySubmodels(Collection submodelIds, boolean includeConceptDescription) { + String submodelIdsArrayString = createIdsArrayString(submodelIds); + + return getURL() + "/serialization?" + getSubmodelIdsParameter(submodelIdsArrayString) + "&includeConceptDescriptions=" + includeConceptDescription; + } + + private static String getAasIdsParameter(String aasIdsArrayString) { + return "aasIds=" + aasIdsArrayString; + } + + private static String getSubmodelIdsParameter(String submodelIdsArrayString) { + return "submodelIds=" + submodelIdsArrayString; + } + + private static String createIdsArrayString(Collection ids) { + String idsArrayString = ""; + for (String id : ids) { + if (!idsArrayString.isEmpty()) + idsArrayString = idsArrayString.concat(","); + idsArrayString = idsArrayString.concat(Base64UrlEncodedIdentifier.encodeIdentifier(id)); + } + return idsArrayString; + } + + public static List createIdCollection(String... ids) { + List results = new ArrayList<>(); + for (String id : ids) { + results.add(id); + } + return results; + } + + public String readStringFromFile(String fileName) throws FileNotFoundException, IOException { + File file = ResourceUtils.getFile(fileName); + InputStream in = new FileInputStream(file); + return IOUtils.toString(in, StandardCharsets.UTF_8.name()); + } + + @AfterClass + public static void shutdown() { + appContext.close(); + } +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/AASEnvironmentValueOnly.json b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/AASEnvironmentValueOnly.json new file mode 100644 index 000000000..924987836 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/AASEnvironmentValueOnly.json @@ -0,0 +1,38 @@ +{ + "ObserveValueUpdates": { + "observed": { + "type": "ExternalReference", + "keys": [ + { + "type": "Submodel", + "value": "www.example.com/ids/sm/2222_8041_1042_8057" + } + ] + } + }, + "ViaMqtt": { + "L1": "290.6217782649107", + "L2": "282.4599521889145", + "L3": "272.2067133660983", + "Active_Power_All": "104308.59396737856" + }, + "AnnotationBottom": "", + "ViaOpcUa": { + "L1": "299.53634421194454", + "L2": "296.55226321871635", + "L3": "290.9149535087691", + "Active_Power_All": "109456.23941992565" + }, + "ViaModbus": { + "L1": "160.26637", + "L2": "160.44434", + "L3": "163.39528", + "Active_Power_All": "59738.68" + }, + "ViaHTTP": { + "L1": "291.4213289500366", + "L2": "296.869547091201", + "L3": "299.65015492058336", + "Active_Power_All": "109572.7967447997" + } +} \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/application.properties b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/application.properties new file mode 100644 index 000000000..65b3c5e1f --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/application.properties @@ -0,0 +1,4 @@ +server.port=8081 +basyx.backend = InMemory + +basyx.environment = classpath:fileSerializationTest.aasx \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/fileSerializationTest.aasx b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/fileSerializationTest.aasx new file mode 100644 index 000000000..79c53658d Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/fileSerializationTest.aasx differ diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/operationalDataEnvironment.json b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/operationalDataEnvironment.json new file mode 100644 index 000000000..a2a9b09cb --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/operationalDataEnvironment.json @@ -0,0 +1 @@ +{"assetAdministrationShells":[{"idShort":"AAS_Template_for_AID","id":"www.example.com/ids/sm/1043_4141_1042_9896","assetInformation":{"assetKind":"Type","globalAssetId":"https://example.com/ids/asset/3071_4170_8032_4893","specificAssetIds":[],"assetType":"","defaultThumbnail":{"path":"/aasx/files/Siemens_Sentron_PAC4200.jpg","contentType":"image/jpeg"}},"submodels":[{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"}]},{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/7294_7031_0132_7227"}]},{"type":"ExternalReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"}]},{"type":"ExternalReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/1043_4141_1042_4837"}]}],"modelType":"AssetAdministrationShell"}],"submodels":[{"idShort":"AssetInterfacesDescription","description":[{"language":"en","text":"AID Template Sample"}],"id":"https://example.com/ids/sm/4333_9041_7022_4184","kind":"Instance","semanticId":{"type":"ExternalReference","keys":[{"type":"Submodel","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Submodel"}]},"submodelElements":[{"idShort":"InterfaceHTTP","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Interface"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://www.w3.org/2011/http"}]},{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Siemens SENTRON PAC4200","modelType":"Property"},{"idShort":"EndpointMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"base","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#base"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:anyURI","value":"http://127.0.0.1:8080","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"modbus","modelType":"Property"},{"idShort":"security","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasSecurityConfiguration"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","value":[{"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"Interface"},{"type":"SubmodelElementCollection","value":"EndpointMetadata"},{"type":"SubmodelElementCollection","value":"securityDefinitions"},{"type":"SubmodelElementCollection","value":"basic_sc"}]},"modelType":"ReferenceElement"}],"modelType":"SubmodelElementList"},{"idShort":"securityDefinitions","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"nosec_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#NoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"nosec","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"auto_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#AutoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"auto","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"basic_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BasicSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"basic","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"combo_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#ComboSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"combo","modelType":"Property"},{"idShort":"oneOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#oneOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"allOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#allOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"apikey_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#APIKeySecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"apikey","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"psk_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#PSKSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"psk","modelType":"Property"},{"idShort":"identity","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#identity"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"digest_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#DigestSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"digest","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"qop","qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"bearer_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BearerSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"bearer","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"alg","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#alg"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"format","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#format"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"oauth2_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#OAuth2SecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"oauth2","modelType":"Property"},{"idShort":"token","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#token"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"refresh","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#refresh"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"scopes","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#scopes"}]},"qualifiers":[],"valueType":"xs:string","value":"","modelType":"Property"},{"idShort":"flow","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#flow"}]},"qualifiers":[],"valueType":"xs:string","value":"code","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InterfaceMetadata"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#InteractionAffordance"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"properties","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#PropertyAffordance"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"Voltage_L1_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L1 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"L1","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"},{"idShort":"htv_methodName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#methodName"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"ZeroToOne"},{"type":"Constraint","valueType":"xs:string","value":"Only applicable for HTTP binding"}],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"GET","modelType":"Property"},{"idShort":"htv_headers","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#headers"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"ZeroToOne"},{"type":"Constraint","valueType":"xs:string","value":"Only applicable for HTTP binding"}],"typeValueListElement":"SubmodelElement","value":[{"idShort":"htv_headers","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#headers"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"OneToMany"}],"value":[{"idShort":"htv_fieldName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#fieldName"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"One"}],"valueType":"xs:string","value":"name","modelType":"Property"},{"idShort":"htv_fieldValue","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#fieldValue"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"One"}],"valueType":"xs:string","value":"value","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementList"},{"idShort":"htv_pollingTime","semanticId":{"type":"ModelReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/http#pollingTime"}]},"qualifiers":[],"valueType":"xs:string","value":"1000","modelType":"Property"},{"idShort":"htv_timeout","semanticId":{"type":"ModelReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/http#timeout"}]},"qualifiers":[],"valueType":"xs:string","value":"3000","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L2_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L2 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"/L2","modelType":"Property"},{"idShort":"htv_methodName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#methodName"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"ZeroToOne"},{"type":"Constraint","valueType":"xs:string","value":"Only applicable for HTTP binding"}],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"GET","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L3_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L3 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"L3","modelType":"Property"},{"idShort":"htv_methodName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#methodName"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"ZeroToOne"},{"type":"Constraint","valueType":"xs:string","value":"Only applicable for HTTP binding"}],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"GET","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Active_Power_L1_L2_L3","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Sum of all active powers on L1, L2, L3","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"/all","modelType":"Property"},{"idShort":"htv_methodName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2011/http#methodName"}]},"qualifiers":[{"type":"Cardinality","valueType":"xs:string","value":"ZeroToOne"},{"type":"Constraint","valueType":"xs:string","value":"Only applicable for HTTP binding"}],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"GET","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"ExternalDescriptor","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/ExternalDescriptor"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"fileName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/externalDescriptorName"}]},"embeddedDataSpecifications":[],"value":"File path value must not be empty","contentType":"application/json","modelType":"File"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceMODBUS","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Interface"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://www.w3.org/2011/modbus"}]},{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Siemens SENTRON PAC4200","modelType":"Property"},{"idShort":"EndpointMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"base","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#base"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:anyURI","value":"modbus\u002Btcp://127.0.0.1:5020/99/","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"security","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasSecurityConfiguration"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","value":[{"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"Interface"},{"type":"SubmodelElementCollection","value":"EndpointMetadata"},{"type":"SubmodelElementCollection","value":"securityDefinitions"},{"type":"SubmodelElementCollection","value":"basic_sc"}]},"modelType":"ReferenceElement"}],"modelType":"SubmodelElementList"},{"idShort":"securityDefinitions","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"nosec_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#NoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"nosec","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"auto_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#AutoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"auto","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"basic_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BasicSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"basic","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"combo_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#ComboSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"combo","modelType":"Property"},{"idShort":"oneOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#oneOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"allOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#allOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"apikey_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#APIKeySecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"apikey","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"psk_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#PSKSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"psk","modelType":"Property"},{"idShort":"identity","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#identity"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"digest_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#DigestSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"digest","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"qop","qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"bearer_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BearerSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"bearer","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"alg","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#alg"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"format","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#format"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"oauth2_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#OAuth2SecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"oauth2","modelType":"Property"},{"idShort":"token","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#token"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"refresh","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#refresh"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"scopes","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#scopes"}]},"qualifiers":[],"valueType":"xs:string","value":"","modelType":"Property"},{"idShort":"flow","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#flow"}]},"qualifiers":[],"valueType":"xs:string","value":"code","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InterfaceMetadata"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#InteractionAffordance"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"properties","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#PropertyAffordance"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"Voltage_L1_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L1 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"1?quantity=2","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"modbus_function","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#Function"}]},"qualifiers":[],"valueType":"xs:string","value":"readHoldingRegisters","modelType":"Property"},{"idShort":"modbus_type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#type"}]},"qualifiers":[],"valueType":"xs:string","value":"floatbe","modelType":"Property"},{"idShort":"modbus_pollingTime","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#pollingTime"}]},"qualifiers":[],"valueType":"xs:string","value":"500","modelType":"Property"},{"idShort":"modbus_timeout","semanticId":{"type":"ModelReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#timeout"}]},"qualifiers":[],"valueType":"xs:string","value":"3000","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L2_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L2 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"3?quantity=2","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"modbus_function","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#Function"}]},"qualifiers":[],"valueType":"xs:string","value":"readHoldingRegisters","modelType":"Property"},{"idShort":"modbus_type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#type"}]},"qualifiers":[],"valueType":"xs:string","value":"floatbe","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L3_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L3 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"5?quantity=2","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"modbus_function","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#Function"}]},"qualifiers":[],"valueType":"xs:string","value":"readHoldingRegisters","modelType":"Property"},{"idShort":"modbus_type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#type"}]},"qualifiers":[],"valueType":"xs:string","value":"floatbe","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Active_Power_L1_L2_L3","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Sum of all active powers on L1, L2, L3","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"65?quantity=2","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"modbus_function","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#Function"}]},"qualifiers":[],"valueType":"xs:string","value":"readHoldingRegisters","modelType":"Property"},{"idShort":"modbus_type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/modbus#type"}]},"qualifiers":[],"valueType":"xs:string","value":"floatbe","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"ExternalDescriptor","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/ExternalDescriptor"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"fileName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/externalDescriptorName"}]},"embeddedDataSpecifications":[],"value":"File path value must not be empty","contentType":"application/json","modelType":"File"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceMQTT","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Interface"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://www.w3.org/2011/mqtt"}]},{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Siemens SENTRON PAC4200","modelType":"Property"},{"idShort":"EndpointMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"base","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#base"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:anyURI","value":"http://127.0.0.1:1883","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"security","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasSecurityConfiguration"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","value":[{"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"Interface"},{"type":"SubmodelElementCollection","value":"EndpointMetadata"},{"type":"SubmodelElementCollection","value":"securityDefinitions"},{"type":"SubmodelElementCollection","value":"basic_sc"}]},"modelType":"ReferenceElement"}],"modelType":"SubmodelElementList"},{"idShort":"securityDefinitions","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"nosec_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#NoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"nosec","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"auto_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#AutoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"auto","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"basic_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BasicSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"basic","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"combo_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#ComboSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"combo","modelType":"Property"},{"idShort":"oneOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#oneOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"allOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#allOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"apikey_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#APIKeySecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"apikey","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"psk_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#PSKSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"psk","modelType":"Property"},{"idShort":"identity","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#identity"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"digest_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#DigestSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"digest","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"qop","qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"bearer_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BearerSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"bearer","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"alg","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#alg"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"format","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#format"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"oauth2_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#OAuth2SecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"oauth2","modelType":"Property"},{"idShort":"token","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#token"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"refresh","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#refresh"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"scopes","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#scopes"}]},"qualifiers":[],"valueType":"xs:string","value":"","modelType":"Property"},{"idShort":"flow","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#flow"}]},"qualifiers":[],"valueType":"xs:string","value":"code","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InterfaceMetadata"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#InteractionAffordance"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"properties","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#PropertyAffordance"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"Voltage_L1_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L1 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"voltage/L1","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"},{"idShort":"mqv_qos","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasQoSFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"mqv_controlPacket","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#ControlPacket"}]},"qualifiers":[],"valueType":"xs:string","value":"subscribe","modelType":"Property"},{"idShort":"mqv_retain","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasRetainFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L2_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L2 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"voltage/L2","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"},{"idShort":"mqv_qos","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasQoSFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"mqv_controlPacket","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#ControlPacket"}]},"qualifiers":[],"valueType":"xs:string","value":"subscribe","modelType":"Property"},{"idShort":"mqv_retain","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasRetainFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L3_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L3 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"voltage/L3","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"},{"idShort":"mqv_qos","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasQoSFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"mqv_controlPacket","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#ControlPacket"}]},"qualifiers":[],"valueType":"xs:string","value":"subscribe","modelType":"Property"},{"idShort":"mqv_retain","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasRetainFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Active_Power_L1_L2_L3","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Sum of all active powers on L1, L2, L3","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"all/active_power","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"},{"idShort":"mqv_qos","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasQoSFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"mqv_controlPacket","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#ControlPacket"}]},"qualifiers":[],"valueType":"xs:string","value":"subscribe","modelType":"Property"},{"idShort":"mqv_retain","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/mqtt#hasRetainFlag"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"ExternalDescriptor","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/ExternalDescriptor"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"fileName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/externalDescriptorName"}]},"embeddedDataSpecifications":[],"value":"File path value must not be empty","contentType":"application/json","modelType":"File"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceOPCUA","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Interface"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://www.w3.org/2011/opc-ua"}]},{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Siemens SENTRON PAC4200","modelType":"Property"},{"idShort":"EndpointMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"base","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#base"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:anyURI","value":"opc.tcp://localhost:4840/freeopcua/server/","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/octet-stream","modelType":"Property"},{"idShort":"security","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasSecurityConfiguration"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","value":[{"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"Interface"},{"type":"SubmodelElementCollection","value":"EndpointMetadata"},{"type":"SubmodelElementCollection","value":"securityDefinitions"},{"type":"SubmodelElementCollection","value":"basic_sc"}]},"modelType":"ReferenceElement"}],"modelType":"SubmodelElementList"},{"idShort":"securityDefinitions","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"nosec_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#NoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"nosec","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"auto_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#AutoSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"auto","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"basic_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BasicSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"basic","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"combo_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#ComboSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"combo","modelType":"Property"},{"idShort":"oneOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#oneOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"allOf","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/json-schema#allOf"}]},"qualifiers":[],"typeValueListElement":"SubmodelElement","modelType":"SubmodelElementList"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"apikey_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#APIKeySecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"apikey","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"psk_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#PSKSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"psk","modelType":"Property"},{"idShort":"identity","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#identity"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"digest_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#DigestSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"digest","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"qop","qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"bearer_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#BearerSecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"bearer","modelType":"Property"},{"idShort":"name","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#name"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"in","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#in"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"alg","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#alg"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"format","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#format"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:string","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"oauth2_sc","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#OAuth2SecurityScheme"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"scheme","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#definesSecurityScheme"}]},"qualifiers":[],"valueType":"xs:string","value":"oauth2","modelType":"Property"},{"idShort":"token","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#token"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"refresh","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#refresh"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"authorization","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#authorization"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"},{"idShort":"scopes","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#scopes"}]},"qualifiers":[],"valueType":"xs:string","value":"","modelType":"Property"},{"idShort":"flow","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#flow"}]},"qualifiers":[],"valueType":"xs:string","value":"code","modelType":"Property"},{"idShort":"proxy","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/security#proxy"}]},"qualifiers":[],"valueType":"xs:anyURI","value":"","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"InterfaceMetadata","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InterfaceMetadata"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#InteractionAffordance"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"properties","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#PropertyAffordance"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"Voltage_L1_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L1 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"ns=2;i=2","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"},{"idShort":"opcua_pollingTime","semanticId":{"type":"ModelReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/opc-ua#pollingTime"}]},"qualifiers":[],"valueType":"xs:string","value":"500","modelType":"Property"},{"idShort":"opcua_timeout","semanticId":{"type":"ModelReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/opc-ua#timeout"}]},"qualifiers":[],"valueType":"xs:string","value":"3000","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L2_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L2 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"ns=2;i=3","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Voltage_L3_N","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Voltage L3 to N","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"ns=2;i=4","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"Active_Power_L1_L2_L3","description":[],"semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition"}]},"supplementalSemanticIds":[{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://www.w3.org/2019/wot/td#name"}]}],"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"title","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#title"}]},"qualifiers":[],"valueType":"xs:string","value":"Sum of all active powers on L1, L2, L3","modelType":"Property"},{"idShort":"type","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type"}]},"qualifiers":[],"valueType":"xs:string","value":"float","modelType":"Property"},{"idShort":"observable","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#isObservable"}]},"qualifiers":[],"valueType":"xs:boolean","value":"true","modelType":"Property"},{"idShort":"unit","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://schema.org/unitCode"}]},"qualifiers":[],"valueType":"xs:string","value":"V","modelType":"Property"},{"idShort":"forms","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/td#hasForm"}]},"embeddedDataSpecifications":[],"value":[{"idShort":"href","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#hasTarget"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"ns=2;i=5","modelType":"Property"},{"idShort":"contentType","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://www.w3.org/2019/wot/hypermedia#forContentType"}]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"application/json","modelType":"Property"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"},{"idShort":"ExternalDescriptor","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/ExternalDescriptor"}]},"qualifiers":[],"embeddedDataSpecifications":[],"value":[{"idShort":"fileName","semanticId":{"type":"ExternalReference","keys":[{"type":"ConceptDescription","value":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/externalDescriptorName"}]},"embeddedDataSpecifications":[],"value":"File path value must not be empty","contentType":"application/json","modelType":"File"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementCollection"}],"modelType":"Submodel"},{"idShort":"AssetInterfacesMappingConfiguration","id":"https://example.com/ids/sm/7294_7031_0132_7227","kind":"Instance","semanticId":{"type":"ExternalReference","keys":[{"type":"Submodel","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/Submodel"}]},"submodelElements":[{"idShort":"MappingConfigurations","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingConfigurations"}]},"qualifiers":[],"semanticIdListElement":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingConfiguration"}]},"typeValueListElement":"SubmodelElementCollection","value":[{"idShort":"Mapping_HTTP","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingConfiguration"}]},"qualifiers":[],"value":[{"idShort":"InterfaceReference","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/InterfaceReference"}]},"qualifiers":[],"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceHTTP"}]},"modelType":"ReferenceElement"},{"idShort":"MappingSourceSinkRelations","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelations"}]},"qualifiers":[],"semanticIdListElement":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"typeValueListElement":"RelationshipElement","value":[{"idShort":"HTTP_L1","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceHTTP"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L1_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaHTTP"},{"type":"Property","value":"L1"}]},"modelType":"RelationshipElement"},{"idShort":"HTTP_L2","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceHTTP"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L2_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaHTTP"},{"type":"Property","value":"L2"}]},"modelType":"RelationshipElement"},{"idShort":"HTTP_L3","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceHTTP"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L3_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaHTTP"},{"type":"Property","value":"L3"}]},"modelType":"RelationshipElement"},{"idShort":"HTTP_Active_Power_All","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceHTTP"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Active_Power_L1_L2_L3"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaHTTP"},{"type":"Property","value":"Active_Power_All"}]},"modelType":"RelationshipElement"}],"modelType":"SubmodelElementList"}],"modelType":"SubmodelElementCollection"},{"idShort":"Mapping_Modbus","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingConfiguration"}]},"qualifiers":[],"value":[{"idShort":"InterfaceReference","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/InterfaceReference"}]},"qualifiers":[],"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMODBUS"}]},"modelType":"ReferenceElement"},{"idShort":"MappingSourceSinkRelations","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelations"}]},"qualifiers":[],"semanticIdListElement":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"typeValueListElement":"RelationshipElement","value":[{"idShort":"Modbus_L1","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMODBUS"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L1_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaModbus"},{"type":"Property","value":"L1"}]},"modelType":"RelationshipElement"},{"idShort":"Modbus_L2","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMODBUS"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L2_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaModbus"},{"type":"Property","value":"L2"}]},"modelType":"RelationshipElement"},{"idShort":"Modbus_L3","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMODBUS"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L3_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaModbus"},{"type":"Property","value":"L3"}]},"modelType":"RelationshipElement"},{"idShort":"Modbus_Active_Power_All","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMODBUS"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Active_Power_L1_L2_L3"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaModbus"},{"type":"Property","value":"Active_Power_All"}]},"modelType":"RelationshipElement"}],"modelType":"SubmodelElementList"}],"modelType":"SubmodelElementCollection"},{"idShort":"Mapping_Mqtt","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingConfiguration"}]},"qualifiers":[],"value":[{"idShort":"InterfaceReference","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/InterfaceReference"}]},"qualifiers":[],"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMQTT"}]},"modelType":"ReferenceElement"},{"idShort":"MappingSourceSinkRelations","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelations"}]},"qualifiers":[],"semanticIdListElement":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"typeValueListElement":"RelationshipElement","value":[{"idShort":"Mqtt_L1","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMQTT"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L1_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaMqtt"},{"type":"Property","value":"L1"}]},"modelType":"RelationshipElement"},{"idShort":"Mqtt_L2","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMQTT"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L2_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaMqtt"},{"type":"Property","value":"L2"}]},"modelType":"RelationshipElement"},{"idShort":"Mqtt_L3","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMQTT"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L3_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaMqtt"},{"type":"Property","value":"L3"}]},"modelType":"RelationshipElement"},{"idShort":"Mqtt_Active_Power_All","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceMQTT"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Active_Power_L1_L2_L3"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaMqtt"},{"type":"Property","value":"Active_Power_All"}]},"modelType":"RelationshipElement"}],"modelType":"SubmodelElementList"}],"modelType":"SubmodelElementCollection"},{"idShort":"Mapping_OpcUa","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingConfiguration"}]},"qualifiers":[],"value":[{"idShort":"InterfaceReference","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/InterfaceReference"}]},"qualifiers":[],"value":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceOPCUA"}]},"modelType":"ReferenceElement"},{"idShort":"MappingSourceSinkRelations","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelations"}]},"qualifiers":[],"semanticIdListElement":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"typeValueListElement":"RelationshipElement","value":[{"idShort":"OpcUa_L1","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceOPCUA"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L1_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaOpcUa"},{"type":"Property","value":"L1"}]},"modelType":"RelationshipElement"},{"idShort":"OpcUa_L2","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceOPCUA"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L2_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaOpcUa"},{"type":"Property","value":"L2"}]},"modelType":"RelationshipElement"},{"idShort":"OpcUa_L3","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceOPCUA"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Voltage_L3_N"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaOpcUa"},{"type":"Property","value":"L3"}]},"modelType":"RelationshipElement"},{"idShort":"OpcUa_Active_Power_All","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/idta/AssetInterfacesMappingConfiguration/1/0/MappingSourceSinkRelation"}]},"qualifiers":[],"first":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://example.com/ids/sm/4333_9041_7022_4184"},{"type":"SubmodelElementCollection","value":"InterfaceOPCUA"},{"type":"SubmodelElementCollection","value":"InterfaceMetadata"},{"type":"SubmodelElementCollection","value":"properties"},{"type":"SubmodelElementCollection","value":"Active_Power_L1_L2_L3"}]},"second":{"type":"ModelReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"},{"type":"SubmodelElementCollection","value":"ViaOpcUa"},{"type":"Property","value":"Active_Power_All"}]},"modelType":"RelationshipElement"}],"modelType":"SubmodelElementList"}],"modelType":"SubmodelElementCollection"}],"modelType":"SubmodelElementList"}],"modelType":"Submodel"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ title: \u0022Asset integration using multiple technologies\u0022, timer: 500, tiles: true }"}],"idShort":"OperationalData","id":"www.example.com/ids/sm/2222_8041_1042_8057","semanticId":{"type":"ModelReference","keys":[{"type":"Submodel","value":"https://admin-shell.io/sandbox/pi40/CarbonMonitoring/1/0"}]},"submodelElements":[{"idShort":"ViaHTTP","value":[{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:1, src: \u0022Event\u0022, title: \u0022Phase voltages HTTP\u0022, fmt: \u0022F0\u0022, row: 0, col: 0, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L1","valueType":"xs:double","value":"291.4213289500366","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:1, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 0, col: 1, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L2","valueType":"xs:double","value":"296.869547091201","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:1, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 0, col: 2, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L3","valueType":"xs:double","value":"299.65015492058336","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:5, src: \u0022Event\u0022, title: \u0022Power consumption (all technologies)\u0022, fmt: \u0022F0\u0022, row: 6, col: 0, rowspan: 3, colspan:2, unit: \u0022W\u0022, linewidth: 2.0 }"}],"idShort":"Active_Power_All","valueType":"xs:double","value":"109572.7967447997","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"ViaModbus","value":[{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:2, src: \u0022Event\u0022, title: \u0022Phase voltages MODBUS\u0022, fmt: \u0022F0\u0022, row: 1, col: 0, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L1","valueType":"xs:double","value":"160.26637","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:2, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 1, col: 1, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L2","valueType":"xs:double","value":"160.44434","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:2, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 1, col: 2, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L3","valueType":"xs:double","value":"163.39528","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:5, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 6, col: 2, rowspan: 1, colspan:1, unit: \u0022W\u0022, linewidth: 2.0 }"}],"idShort":"Active_Power_All","valueType":"xs:double","value":"59738.68","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"ViaMqtt","value":[{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:3, src: \u0022Event\u0022, title: \u0022Phase voltages MQTT\u0022, fmt: \u0022F0\u0022, row: 2, col: 0, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L1","valueType":"xs:double","value":"290.6217782649107","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:3, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 2, col: 1, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L2","valueType":"xs:double","value":"282.4599521889145","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:3, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 2, col: 2, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L3","valueType":"xs:double","value":"272.2067133660983","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:5, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 7, col: 2, rowspan: 1, colspan:1, unit: \u0022W\u0022, linewidth: 2.0 }"}],"idShort":"Active_Power_All","valueType":"xs:double","value":"104308.59396737856","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"ViaOpcUa","value":[{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:4, src: \u0022Event\u0022, title: \u0022Phase voltages OPC-UA\u0022, fmt: \u0022F0\u0022, row: 3, col: 0, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L1","valueType":"xs:double","value":"299.53634421194454","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:4, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 3, col: 1, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L2","valueType":"xs:double","value":"296.55226321871635","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:4, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 3, col: 2, rowspan: 1, colspan:1, unit: \u0022V\u0022, linewidth: 1.0 }"}],"idShort":"L3","valueType":"xs:double","value":"290.9149535087691","modelType":"Property"},{"extensions":[{"name":"Plotting.Args","valueType":"xs:string","value":"{ grp:5, src: \u0022Event\u0022, fmt: \u0022F0\u0022, row: 8, col: 2, rowspan: 1, colspan:1, unit: \u0022W\u0022, linewidth: 2.0 }"}],"idShort":"Active_Power_All","valueType":"xs:double","value":"109456.23941992565","modelType":"Property"}],"modelType":"SubmodelElementCollection"},{"idShort":"ObserveValueUpdates","semanticId":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"https://admin-shell.io/tmp/AAS/Events/UpdateValueOutwards"}]},"observed":{"type":"ExternalReference","keys":[{"type":"Submodel","value":"www.example.com/ids/sm/2222_8041_1042_8057"}]},"direction":"input","state":"off","modelType":"BasicEventElement"},{"extensions":[{"name":"Annotation.Args","valueType":"xs:string","value":"{ pos: \u0022bottom\u0022, bold: true, text: \u0022Closing remarks\u0022, top: 20 }"},{"name":"Annotation.Args","valueType":"xs:string","value":"{ pos: \u0022bottom\u0022, text: \u0022This Submodel demonstrates the use of the Submodel Templates for Asset Interface Description (AID) to aquire information from the asset interfaces by use of existing standards and technologies.\u0022 }"}],"idShort":"AnnotationBottom","semanticId":{"type":"ExternalReference","keys":[]},"qualifiers":[],"embeddedDataSpecifications":[],"valueType":"xs:string","value":"","modelType":"Property"}],"modelType":"Submodel"},{"idShort":"Animated","id":"www.example.com/ids/sm/1043_4141_1042_4837","submodelElements":[{"extensions":[{"name":"Animate.Args","value":"{ type: \u0022Sin\u0022, ofs: 230.0, scale: 10.0, freq: 0.05, timer: 500 }"}],"idShort":"Simple","valueType":"xs:double","value":"222.95733322071817","modelType":"Property"}],"modelType":"Submodel"}],"conceptDescriptions":[{"idShort":"AssetInterfacesDescription","description":[{"language":"en","text":"AID Template Sample"}],"id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Submodel","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"AssetInterfacesDescription"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":"AID Template Sample"}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"GenericInterface","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/Interface","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"InterfaceHTTP(it can be any name but the semanticId must give context to the protocol been used)"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"title","id":"https://www.w3.org/2019/wot/td#title","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"title"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"created","id":"https://www.w3.org/2019/wot/td#created","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"created"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modified","id":"https://www.w3.org/2019/wot/td#modified","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modified"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"support","id":"https://www.w3.org/2019/wot/td#support","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"support"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"EndpointMetadata","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/EndpointMetadata","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"EndpointMetadata"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"base","id":"https://www.w3.org/2019/wot/td#base","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"base"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"contentType","id":"https://www.w3.org/2019/wot/hypermedia#forContentType","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"contentType"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"security","id":"https://www.w3.org/2019/wot/td#hasSecurityConfiguration","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"security"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"securityDefinitions","id":"https://www.w3.org/2019/wot/td#definesSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"securityDefinitions"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"nosec_sc","id":"https://www.w3.org/2019/wot/security#NoSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"nosec_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"auto_sc","id":"https://www.w3.org/2019/wot/security#AutoSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"auto_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"proxy","id":"https://www.w3.org/2019/wot/security#proxy","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"proxy"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"basic_sc","id":"https://www.w3.org/2019/wot/security#BasicSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"basic_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"name","id":"https://www.w3.org/2019/wot/security#name","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"name"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"in","id":"https://www.w3.org/2019/wot/security#in","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"in"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"combo_sc","id":"https://www.w3.org/2019/wot/security#ComboSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"combo_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"oneOf","id":"https://www.w3.org/2019/wot/json-schema#oneOf","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"oneOf"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"allOf","id":"https://www.w3.org/2019/wot/json-schema#allOf","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"allOf"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"apikey_sc","id":"https://www.w3.org/2019/wot/security#APIKeySecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"apikey_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"psk_sc","id":"https://www.w3.org/2019/wot/security#PSKSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"psk_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"identity","id":"https://www.w3.org/2019/wot/security#identity","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"identity"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"digest_sc","id":"https://www.w3.org/2019/wot/security#DigestSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"digest_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"bearer_sc","id":"https://www.w3.org/2019/wot/security#BearerSecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"bearer_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"authorization","id":"https://www.w3.org/2019/wot/security#authorization","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"authorization"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"alg","id":"https://www.w3.org/2019/wot/security#alg","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"alg"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"format","id":"https://www.w3.org/2019/wot/security#format","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"format"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"oauth2_sc","id":"https://www.w3.org/2019/wot/security#OAuth2SecurityScheme","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"oauth2_sc"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"token","id":"https://www.w3.org/2019/wot/security#token","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"token"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"refresh","id":"https://www.w3.org/2019/wot/security#refresh","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"refresh"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"scopes","id":"https://www.w3.org/2019/wot/security#scopes","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"scopes"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"flow","id":"https://www.w3.org/2019/wot/security#flow","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"flow"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"InterfaceMetadata","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/InterfaceMetadata","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"InterfaceMetadata"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"propertiesAffordance","id":"https://www.w3.org/2019/wot/td#PropertyAffordance","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"properties"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"propertyName","description":[{"language":"en","text":"Current counter value"},{"language":"de","text":"Derzeitiger Z\u00E4hlerwert"},{"language":"it","text":"Valore attuale del contatore"}],"id":"https://admin-shell.io/idta/AssetInterfaceDescription/1/0/PropertyDefinition","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"propertyName"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":"Current counter value"}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"key","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/key","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"key"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"type","id":"https://www.w3.org/1999/02/22-rdf-syntax-ns#type","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"type"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"observable","id":"https://www.w3.org/2019/wot/td#isObservable","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"observable"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"const","id":"https://www.w3.org/2019/wot/json-schema#const","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"const"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"default","id":"https://www.w3.org/2019/wot/json-schema#default","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"default"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"unit","id":"https://schema.org/unitCode","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"unit"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"min_max","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/minMaxRange","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"min_max"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"lengthRange","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/lengthRange","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"lengthRange"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"items","id":"https://www.w3.org/2019/wot/json-schema#items","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"items"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"valueSemantics","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/valueSemantics","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"valueSemantics"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"itemsRange","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/itemsRange","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"itemsRange"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"properties","id":"https://www.w3.org/2019/wot/json-schema#properties","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"properties"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"{propertyName}","description":[{"language":"en","text":"Current counter value"},{"language":"de","text":"Derzeitiger Z\u00E4hlerwert"},{"language":"it","text":"Valore attuale del contatore"}],"id":"https://www.w3.org/2019/wot/json-schema#propertyName","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"{propertyName}"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":"Current counter value"}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"forms","id":"https://www.w3.org/2019/wot/td#hasForm","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"forms"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"href","id":"https://www.w3.org/2019/wot/hypermedia#hasTarget","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"href"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"htv_methodName","id":"https://www.w3.org/2011/http#methodName","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"htv_methodName"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"htv_headers","id":"https://www.w3.org/2011/http#headers","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"htv_headers"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"htv_fieldName","id":"https://www.w3.org/2011/http#fieldName","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"htv_fieldName"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"htv_fieldValue","id":"https://www.w3.org/2011/http#fieldValue","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"htv_fieldValue"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"actions","id":"https://www.w3.org/2019/wot/td#ActionAffordance","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"actions"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"events","id":"https://www.w3.org/2019/wot/td#EventAffordance","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"events"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"ExternalDescriptor","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/ExternalDescriptor","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"ExternalDescriptor"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"fileName","id":"https://admin-shell.io/idta/AssetInterfacesDescription/1/0/externalDescriptorName","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"fileName"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modbus_function","id":"https://www.w3.org/2019/wot/modbus#Function","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modbus_function"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modbus_entity","id":"https://www.w3.org/2019/wot/modbus#Entity","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modbus_entity"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modbus_zeroBasedAddressing","id":"https://www.w3.org/2019/wot/modbus#hasZeroBasedAddressingFlag","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modbus_zeroBasedAddressing"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modbus_pollingTime","id":"https://www.w3.org/2019/wot/modbus#pollingTime","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modbus_pollingTime"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modbus_timeout","id":"https://www.w3.org/2019/wot/mqtt#hasQoSFlag","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modbus_timeout"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"modbus_type","id":"https://www.w3.org/2019/wot/modbus#type","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"modbus_type"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"mqv_retain","id":"https://www.w3.org/2019/wot/mqtt#hasRetainFlag","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"mqv_retain"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"},{"idShort":"mqv_controlPacket","id":"https://www.w3.org/2019/wot/mqtt#ControlPacket","embeddedDataSpecifications":[{"dataSpecification":{"type":"ExternalReference","keys":[{"type":"GlobalReference","value":"http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"}]},"dataSpecificationContent":{"preferredName":[{"language":"en","text":"mqv_controlPacket"}],"shortName":[{"language":"en","text":""}],"unit":"","definition":[{"language":"en","text":""}],"modelType":"DataSpecificationIec61360"}}],"modelType":"ConceptDescription"}]} \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.aasx b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.aasx new file mode 100644 index 000000000..9cd1b82d6 Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.aasx differ diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.json b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.json new file mode 100644 index 000000000..3e02f62f3 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.json @@ -0,0 +1,236 @@ +{ + "assetAdministrationShells": [ + { + "modelType": "AssetAdministrationShell", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://acplt.test/Test_Asset" + }, + "derivedFrom": { + "keys": [ + { + "type": "AssetAdministrationShell", + "value": "https://acplt.test/TestAssetAdministrationShell" + } + ], + "type": "ExternalReference" + }, + "submodels": [ + { + "keys": [ + { + "type": "Submodel", + "value": "https://acplt.test/Test_Submodel" + } + ], + "type": "ExternalReference" + }, + { + "keys": [ + { + "type": "Submodel", + "value": "http://acplt.test/Submodels/Assets/TestAsset/BillOfMaterial" + } + ], + "type": "ExternalReference" + }, + { + "keys": [ + { + "type": "Submodel", + "value": "http://acplt.test/Submodels/Assets/TestAsset/Identification" + } + ], + "type": "ExternalReference" + } + ], + "administration": { + "revision": "9", + "version": "0" + }, + "id": "https://acplt.test/Test_AssetAdministrationShell", + "idShort": "TestAssetAdministrationShell", + "description": [ + { + "language": "en-us", + "text": "An Example Asset Administration Shell for the test application" + }, + { + "language": "de", + "text": "Ein Beispiel-Verwaltungsschale für eine Test-Anwendung" + } + ] + } + ], + "conceptDescriptions": [ + { + "modelType": "ConceptDescription", + "administration": { + "revision": "9", + "version": "0" + }, + "id": "https://acplt.test/Test_ConceptDescription", + "idShort": "TestConceptDescription", + "isCaseOf": [ + { + "keys": [ + { + "type": "GlobalReference", + "value": "http://acplt.test/DataSpecifications/Conceptdescription/TestConceptDescription" + } + ], + "type": "ExternalReference" + } + ], + "description": [ + { + "language": "en-us", + "text": "An example concept description for the test application" + }, + { + "language": "de", + "text": "Ein Beispiel-ConceptDescription für eine Test-Anwendung" + } + ] + } + ], + "submodels": [ + { + "modelType": "Submodel", + "kind": "Instance", + "semanticId": { + "keys": [ + { + "type": "Submodel", + "value": "http://acplt.test/SubmodelTemplates/AssetIdentification" + } + ], + "type": "ExternalReference" + }, + "administration": { + "revision": "9", + "version": "0" + }, + "id": "http://acplt.test/Submodels/Assets/TestAsset/Identification", + "idShort": "Identification", + "submodelElements": [ + { + "modelType": "Property", + "semanticId": { + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ], + "type": "ExternalReference" + }, + "value": "http://acplt.test/ValueId/ACPLT", + "valueId": { + "keys": [ + { + "type": "GlobalReference", + "value": "http://acplt.test/ValueId/ACPLT" + } + ], + "type": "ExternalReference" + }, + "valueType": "xs:string", + "qualifiers": [ + { + "type": "http://acplt.test/Qualifier/ExampleQualifier", + "value": "100", + "valueType": "xs:int" + }, + { + "type": "http://acplt.test/Qualifier/ExampleQualifier2", + "value": "50", + "valueType": "xs:int" + } + ], + "idShort": "ManufacturerName", + "displayName": [ + { + "language": "en-us", + "text": "Manufacturer Name" + } + ], + "description": [ + { + "language": "en-us", + "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." + }, + { + "language": "de", + "text": "Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + } + ] + }, + { + "modelType": "Property", + "category": "VARIABLE", + "semanticId": { + "keys": [ + { + "type": "GlobalReference", + "value": "http://opcfoundation.test/UA/DI/1.1/DeviceType/Serialnumber" + } + ], + "type": "ExternalReference" + }, + "supplementalSemanticIds": [ + { + "keys": [ + { + "type": "GlobalReference", + "value": "something_random_e14ad770" + } + ], + "type": "ExternalReference" + }, + { + "keys": [{ + "type": "GlobalReference", + "value": "something_random_bd061acd" + }], + "type": "ExternalReference" + } + + ], + "value": "978-8234-234-342", + "valueId": { + "keys": [ + { + "type": "GlobalReference", + "value": "978-8234-234-342" + } + ], + "type": "ExternalReference" + }, + "valueType": "xs:string", + "idShort": "InstanceId", + "description": [ + { + "language": "en-us", + "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." + }, + { + "language": "de", + "text": "Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + } + ] + } + ], + "description": [ + { + "language": "en-us", + "text": "An example asset identification submodel for the test application" + }, + { + "language": "de", + "text": "Ein Beispiel-Identifikations-Submodel für eine Test-Anwendung" + } + ] + } + ] +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.txt b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.txt new file mode 100644 index 000000000..e69de29bb diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.xml b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.xml new file mode 100644 index 000000000..275ef0276 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry-http/src/test/resources/testEnvironment.xml @@ -0,0 +1,450 @@ + + + + + ExampleMotor + http://customer.test/aas/9175_7013_7091_9168 + + Instance + http://customer.test/assets/KHBVZJSQKIY + + + EquipmentID + 538fd1b3-f99f-4a52-9c75-72e9fa921270 + + ExternalReference + + + GlobalReference + http://customer.test/Systems/ERP/012 + + + + + + DeviceID + QjYgPggjwkiHk4RrQiYSLg== + + ExternalReference + + + GlobalReference + http://customer.test/Systems/IoT/1 + + + + + + + file:///master/verwaltungsschale-detail-part1.png + image/png + + + + + ExternalReference + + + Submodel + http://i40.customer.test/type/1/1/7A7104BDAB57E184 + + + + + ExternalReference + + + Submodel + http://i40.customer.test/instance/1/1/AC69B1CB44F07935 + + + + + ExternalReference + + + Submodel + http://i40.customer.test/type/1/1/1A7B62B529F19152 + + + + + + + + + TechnicalData + http://i40.customer.test/type/1/1/7A7104BDAB57E184 + + ExternalReference + + + GlobalReference + 0173-1#01-AFZ615#016 + + + + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + + + Documentation + http://i40.customer.test/type/1/1/1A7B62B529F19152 + Instance + + + OperatingManual + + ExternalReference + + + ConceptDescription + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Document + + + + + + Title + + ExternalReference + + + ConceptDescription + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Description/Title + + + + xs:string + OperatingManual + + + DigitalFile_PDF + + ExternalReference + + + ConceptDescription + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/StoredDocumentRepresentation/DigitalFile + + + + file:///aasx/OperatingManual.pdf + application/pdf + + + + + + + OperationalData + http://i40.customer.test/instance/1/1/AC69B1CB44F07935 + Instance + + + VARIABLE + RotationSpeed + + ExternalReference + + + ConceptDescription + http://customer.test/cd/1/1/18EBD56F6B43D895 + + + + xs:integer + 4370 + + + + + + + Title + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Description/Title + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + EN + Title + + + DE + Titel + + + + + EN + Title + + + DE + Titel + + + ExampleString + ExampleString + STRING_TRANSLATABLE + + + EN + SprachabhängigerTiteldesDokuments. + + + + + + + + + DigitalFile + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/StoredDocumentRepresentation/DigitalFile + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + EN + DigitalFile + + + EN + DigitalFile + + + + + EN + DigitalFile + + + DE + DigitaleDatei + + + ExampleString + ExampleString + STRING + + + EN + A file representing the document version. In addition to the mandatory PDF file, other files can be specified. + + + + + + + + + PROPERTY + MaxRotationSpeed + + 2 + 1 + + 0173-1#02-BAA120#009 + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + de + max.Drehzahl + + + en + Max.rotationspeed + + + 1/min + + ExternalReference + + + GlobalReference + 0173-1#05-AAA650#002 + + + + ExampleString + REAL_MEASURE + + + de + HöchstezulässigeDrehzahl,mitwelcherderMotoroderdieSpeiseinheitbetriebenwerdendarf + + + EN + Greatestpermissiblerotationspeedwithwhichthemotororfeedingunitmaybeoperated + + + + + + + + + PROPERTY + RotationSpeed + http://customer.test/cd/1/1/18EBD56F6B43D895 + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + DE + AktuelleDrehzahl + + + EN + Actualrotationspeed + + + + + DE + AktuelleDrehzahl + + + EN + ActRotationSpeed + + + 1/min + + ExternalReference + + + GlobalReference + 0173-1#05-AAA650#002 + + + + ExampleString + REAL_MEASURE + + + DE + Aktuelle Drehzahl, mitwelcher der Motor oder die Speiseinheit betrieben wird + + + EN + Actual rotationspeed with which the motor or feedingunit is operated + + + + + + + + + Document + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Document + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + EN + Document + + + + + EN + Document + + + DE + Dokument + + + ExampleString + [ISO15519-1:2010] + STRING + + + EN + Feste und geordnete Menge von für die Verwendung durch Personen bestimmte Informationen, die verwaltet und als Einheit zwischen Benutzern und System ausgetauscht werden kann. + + + + + + + + + + diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/Dockerfile b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/Dockerfile new file mode 100644 index 000000000..ce67dd54f --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/Dockerfile @@ -0,0 +1,11 @@ +FROM eclipse-temurin:17 +USER nobody +WORKDIR /application +ARG JAR_FILE=target/*-exec.jar +COPY ${JAR_FILE} basyxExecutable.jar +COPY src/main/resources/application.properties application.properties +ARG PORT=8081 +ENV SERVER_PORT=${PORT} +EXPOSE ${SERVER_PORT} +HEALTHCHECK --interval=30s --timeout=3s --retries=3 --start-period=15s CMD curl --fail http://localhost:${SERVER_PORT}/actuator/health || exit 1 +ENTRYPOINT ["java","-jar","basyxExecutable.jar"] diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/pom.xml b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/pom.xml new file mode 100644 index 000000000..d71062c9e --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/pom.xml @@ -0,0 +1,187 @@ + + 4.0.0 + + + org.eclipse.digitaltwin.basyx + basyx.digitaltwinregistry + ${revision} + + + basyx.digitaltwinregistry.component + BaSyx Digital Twin Registry Component + BaSyx Digital Twin Registry Component + + + basyx-dt-registry + + + + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-http + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice.component + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-core + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-backend-inmemory + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-backend-mongodb + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-backend + + + org.eclipse.digitaltwin.basyx + basyx.aasdiscoveryservice-feature-authorization + + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service-basemodel + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service-inmemory-storage + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service-mongodb-storage + + + + + + org.springframework.boot + spring-boot-starter-actuator + + + org.eclipse.digitaltwin.aas4j + aas4j-dataformat-xml + + + org.eclipse.digitaltwin.aas4j + aas4j-dataformat-aasx + + + org.xmlunit + xmlunit-core + + + org.xmlunit + xmlunit-matchers + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + exec + + + + + + + + docker + + + docker.namespace + + + + + + io.fabric8 + docker-maven-plugin + + + + + + + ${docker.host.port}:${docker.container.port} + + + + ${docker.container.waitForEndpoint} + + + + + + + + + build-docker + + + push-docker + + + docker-compose-up + pre-integration-test + + start + + + + docker-compose-down + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + + + diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/CommonControllerAdvice.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/CommonControllerAdvice.java new file mode 100644 index 000000000..112f4bd5a --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/CommonControllerAdvice.java @@ -0,0 +1,140 @@ +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.component; + +import java.time.OffsetDateTime; + +import org.eclipse.digitaltwin.basyx.aasregistry.model.Message; +import org.eclipse.digitaltwin.basyx.aasregistry.model.Result; +import org.eclipse.digitaltwin.basyx.aasregistry.model.Message.MessageTypeEnum; +import org.eclipse.digitaltwin.basyx.core.exceptions.AssetLinkDoesNotExistException; +import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingAssetLinkException; +import org.eclipse.digitaltwin.basyx.core.exceptions.CollidingIdentifierException; +import org.eclipse.digitaltwin.basyx.core.exceptions.ElementDoesNotExistException; +import org.eclipse.digitaltwin.basyx.core.exceptions.ElementNotAFileException; +import org.eclipse.digitaltwin.basyx.core.exceptions.FeatureNotSupportedException; +import org.eclipse.digitaltwin.basyx.core.exceptions.FileDoesNotExistException; +import org.eclipse.digitaltwin.basyx.core.exceptions.IdentificationMismatchException; +import org.eclipse.digitaltwin.basyx.core.exceptions.InsufficientPermissionException; +import org.eclipse.digitaltwin.basyx.core.exceptions.MissingIdentifierException; +import org.eclipse.digitaltwin.basyx.core.exceptions.NotInvokableException; +import org.eclipse.digitaltwin.basyx.core.exceptions.NullSubjectException; +import org.eclipse.digitaltwin.basyx.core.exceptions.OperationDelegationException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.server.ResponseStatusException; + +@ControllerAdvice +public class CommonControllerAdvice { + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleValidationException(MethodArgumentNotValidException ex) { + Result result = new Result(); + OffsetDateTime timestamp = OffsetDateTime.now(); + String reason = HttpStatus.BAD_REQUEST.getReasonPhrase(); + for (ObjectError error : ex.getAllErrors()) { + result.addMessagesItem(new Message().code(reason).messageType(MessageTypeEnum.EXCEPTION).text(error.toString()).timestamp(timestamp)); + } + return new ResponseEntity<>(result, HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(ResponseStatusException.class) + public ResponseEntity handleExceptions(ResponseStatusException ex) { + return newResultEntity(ex, HttpStatus.valueOf(ex.getStatusCode().value())); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleExceptions(Exception ex) { + return newResultEntity(ex, HttpStatus.INTERNAL_SERVER_ERROR); + } + + @ExceptionHandler(ElementDoesNotExistException.class) + public ResponseEntity handleElementNotFoundException(ElementDoesNotExistException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(AssetLinkDoesNotExistException.class) + public ResponseEntity handleElementNotFoundException(AssetLinkDoesNotExistException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(FileDoesNotExistException.class) + public ResponseEntity handleElementNotFoundException(FileDoesNotExistException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @ExceptionHandler(CollidingIdentifierException.class) + public ResponseEntity handleCollidingIdentifierException(CollidingIdentifierException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.CONFLICT); + } + + @ExceptionHandler(MissingIdentifierException.class) + public ResponseEntity handleMissingIdentifierException(MissingIdentifierException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(CollidingAssetLinkException.class) + public ResponseEntity handleCollidingIdentifierException(CollidingAssetLinkException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.CONFLICT); + } + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity handleIllegalArgumentException(IllegalArgumentException exception) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(IdentificationMismatchException.class) + public ResponseEntity handleIdMismatchException(IdentificationMismatchException exception) { + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); + } + + @ExceptionHandler(FeatureNotSupportedException.class) + public ResponseEntity handleFeatureNotSupportedException(FeatureNotSupportedException exception) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } + + @ExceptionHandler(NotInvokableException.class) + public ResponseEntity handleNotInvokableException(NotInvokableException exception) { + return new ResponseEntity<>(HttpStatus.METHOD_NOT_ALLOWED); + } + + @ExceptionHandler(ElementNotAFileException.class) + public ResponseEntity handleElementNotAFileException(ElementNotAFileException exception) { + return new ResponseEntity<>(HttpStatus.PRECONDITION_FAILED); + } + + @ExceptionHandler(InsufficientPermissionException.class) + public ResponseEntity handleInsufficientPermissionException(InsufficientPermissionException exception, WebRequest request) { + return new ResponseEntity<>(HttpStatus.FORBIDDEN); + } + + @ExceptionHandler(NullSubjectException.class) + public ResponseEntity handleNullSubjectException(NullSubjectException exception) { + return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); + } + + @ExceptionHandler(OperationDelegationException.class) + public ResponseEntity handleNullSubjectException(OperationDelegationException exception) { + return new ResponseEntity<>(HttpStatus.FAILED_DEPENDENCY); + } + + private ResponseEntity newResultEntity(Exception ex, HttpStatus status) { + Result result = new Result(); + Message message = newExceptionMessage(ex.getMessage(), status); + result.addMessagesItem(message); + return new ResponseEntity<>(result, status); + } + + private Message newExceptionMessage(String msg, HttpStatus status) { + Message message = new Message(); + message.setCode("" + status.value()); + message.setMessageType(MessageTypeEnum.EXCEPTION); + message.setTimestamp(OffsetDateTime.now()); + message.setText(msg); + return message; + } + +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DTRegistryApiDocumentationConfiguration.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DTRegistryApiDocumentationConfiguration.java new file mode 100644 index 000000000..2b228e929 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DTRegistryApiDocumentationConfiguration.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (C) 2023 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.component; + +import org.eclipse.digitaltwin.basyx.http.documentation.RepositoryApiDocumentationConfiguration; +import org.springframework.context.annotation.Configuration; +import io.swagger.v3.oas.models.info.Info; + +/** + * API documentation configuration for DigitalTwin Registry + * + * @author danish + * + */ +@Configuration +public class DTRegistryApiDocumentationConfiguration extends RepositoryApiDocumentationConfiguration { + + private static final String TITLE = "BaSyx Digital Twin Registry"; + private static final String DESCRIPTION = "BaSyx Digital Twin Registry API"; + + @Override + protected Info apiInfo() { + return new Info().title(TITLE) + .description(DESCRIPTION) + .version(VERSION) + .contact(apiContact()) + .license(apiLicence()); + } + +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DefaultLocationBuilder.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DefaultLocationBuilder.java new file mode 100644 index 000000000..78f3f0665 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DefaultLocationBuilder.java @@ -0,0 +1,36 @@ +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.component; + +import java.net.URI; +import java.nio.charset.StandardCharsets; + +import org.eclipse.digitaltwin.basyx.aasregistry.service.api.LocationBuilder; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +public class DefaultLocationBuilder implements LocationBuilder { + + private static final String SM_ID_PARAM = "/{sm-id}"; + private static final String SUBMODEL_DESCRIPTORS = "/submodel-descriptors"; + private static final String SHELL_ID_PARAM = "/{shell-id}"; + private static final String SHELL_DESCRIPTORS = "/shell-descriptors"; + + @Override + public URI getAasLocation(String aasId) { + String encodedAasId = encode(aasId); + return ServletUriComponentsBuilder.fromCurrentContextPath().path(SHELL_DESCRIPTORS).path(SHELL_ID_PARAM).buildAndExpand(encodedAasId).toUri(); + } + + @Override + public URI getSubmodelLocation(String aasId, String submodelId) { + String encodedShellId = encode(aasId); + String encodedSmId = encode(submodelId); + return ServletUriComponentsBuilder.fromCurrentContextPath().path(SHELL_DESCRIPTORS).path(SHELL_ID_PARAM).path(SUBMODEL_DESCRIPTORS).path(SM_ID_PARAM).buildAndExpand(encodedShellId, encodedSmId).toUri(); + } + + private String encode(String value) { + if (value == null) { + return null; + } + return new String(java.util.Base64.getUrlEncoder().encode(value.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); + } + +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DigitalTwinRegistryComponent.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DigitalTwinRegistryComponent.java new file mode 100644 index 000000000..bf668ad53 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DigitalTwinRegistryComponent.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (C) 2023 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.component; + +import org.eclipse.digitaltwin.basyx.aasregistry.service.configuration.RestConfiguration; +import org.eclipse.digitaltwin.basyx.http.BaSyxHTTPConfiguration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; +import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.FullyQualifiedAnnotationBeanNameGenerator; + +import com.fasterxml.jackson.core.JsonProcessingException; + +/** + * Creates and starts the DigitalTwin Registry off-shelf-component. + * + * @author danish + * + */ +@SpringBootApplication(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class, scanBasePackages = { "org.eclipse.digitaltwin.basyx" }, exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, + SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class }) + +@ComponentScan(basePackages = { "org.eclipse.digitaltwin.basyx" }, + + excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = org.eclipse.digitaltwin.basyx.aasregistry.service.OpenApiGeneratorApplication.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = org.eclipse.digitaltwin.basyx.aasdiscoveryservice.component.AasDiscoveryServiceComponent.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = org.eclipse.digitaltwin.basyx.aasdiscoveryservice.http.documentation.AasDiscoveryServiceApiDocumentationConfiguration.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = org.eclipse.digitaltwin.basyx.aasregistry.service.configuration.SpringDocConfiguration.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = RestConfiguration.class), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = BaSyxHTTPConfiguration.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = org.eclipse.digitaltwin.basyx.aasregistry.service.errors.BasyxControllerAdvice.class), + @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = org.eclipse.digitaltwin.basyx.http.BaSyxExceptionHandler.class) }) +public class DigitalTwinRegistryComponent { + + public static void main(String[] args) throws JsonProcessingException { + SpringApplication.run(DigitalTwinRegistryComponent.class, args); + } +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DigitalTwinRegistryConfiguration.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DigitalTwinRegistryConfiguration.java new file mode 100644 index 000000000..3a1db1d7b --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/DigitalTwinRegistryConfiguration.java @@ -0,0 +1,96 @@ +/******************************************************************************* + * Copyright (C) 2024 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.component; + +import java.util.List; +import org.eclipse.digitaltwin.basyx.aasregistry.model.AssetKind; +import org.eclipse.digitaltwin.basyx.aasregistry.service.api.LocationBuilder; +import org.eclipse.digitaltwin.basyx.http.Aas4JHTTPSerializationExtension; +import org.eclipse.digitaltwin.basyx.http.CorsPathPatternProvider; +import org.eclipse.digitaltwin.basyx.http.SerializationExtension; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; +import org.springframework.format.FormatterRegistry; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.SerializationFeature; + +/** + * Configuration for DigitalTwin Registry for dependency injection + * + * @author danish + * + */ +@Configuration +public class DigitalTwinRegistryConfiguration { + + @Bean + public LocationBuilder locationBuilder() { + return new DefaultLocationBuilder(); + } + + @Bean + public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder) { + Jackson2ObjectMapperBuilder builder = jackson2ObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL); + builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + return new MappingJackson2HttpMessageConverter(builder.build()); + } + + @Bean + public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(List serializationExtensions) { + Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().serializationInclusion(JsonInclude.Include.NON_NULL); + + for (SerializationExtension serializationExtension : serializationExtensions) { + serializationExtension.extend(builder); + } + + return builder; + } + + @Bean + public CorsPathPatternProvider getAasRegistryServiceCorsUrlProvider() { + return new CorsPathPatternProvider("/shell-descriptors/**"); + } + + @Bean + public SerializationExtension getExtension() { + return new Aas4JHTTPSerializationExtension(); + } + + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new StringToEnumConverter()); + } + + public static class StringToEnumConverter implements Converter { + @Override + public AssetKind convert(String source) { + return AssetKind.fromValue(source); + } + } + +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/documentation/DigitalTwinRegistryApiDocumentationConfiguration.java b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/documentation/DigitalTwinRegistryApiDocumentationConfiguration.java new file mode 100644 index 000000000..f97f55751 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/java/org/eclipse/digitaltwin/basyx/digitaltwinregistry/component/documentation/DigitalTwinRegistryApiDocumentationConfiguration.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (C) 2024 the Eclipse BaSyx Authors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * SPDX-License-Identifier: MIT + ******************************************************************************/ + +package org.eclipse.digitaltwin.basyx.digitaltwinregistry.component.documentation; + +import org.eclipse.digitaltwin.basyx.aasdiscoveryservice.core.AasDiscoveryService; +import org.eclipse.digitaltwin.basyx.digitaltwinregistry.component.DigitalTwinRegistryComponent; +import org.eclipse.digitaltwin.basyx.http.documentation.RepositoryApiDocumentationConfiguration; +import org.springframework.context.annotation.Configuration; + +import io.swagger.v3.oas.models.info.Info; + +/** + * API documentation configuration for {@link DigitalTwinRegistryComponent} i.e. + * aggregation of API documents from {@link AasDiscoveryService}, + * {@link AasRegistry} + * + * @author danish + * + */ +@Configuration +public class DigitalTwinRegistryApiDocumentationConfiguration extends RepositoryApiDocumentationConfiguration { + + private static final String TITLE = "BaSyx Digital Twin Registry Component"; + private static final String DESCRIPTION = "Digital Twin Registry API"; + + @Override + protected Info apiInfo() { + return new Info().title(TITLE).description(DESCRIPTION).version(VERSION).contact(apiContact()) + .license(apiLicence()); + } + +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/resources/application.properties b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/resources/application.properties new file mode 100644 index 000000000..44faecb34 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/resources/application.properties @@ -0,0 +1,103 @@ +server.port=8081 +spring.application.name=BaSyx Digital Twin Registry + +basyx.backend = MongoDB +# +#registry.type=inMemory +#events.sink=log + +#spring.main.allow-bean-definition-overriding=true +#management.endpoints.web.exposure.include=mappings + +#events.sink=log +# +#description.profiles=https://admin-shell.io/aas/API/3/0/AssetAdministrationShellRegistryServiceSpecification/SSP-001 + +#springdoc.api-docs.path=/api-docs +# +#springfox.documentation.enabled=true +# springfox.documentation.open-api.v3.path=/api-docs + +management.endpoints.web.exposure.include=health,metrics,mappings + +#logging.level.root=INFO + +#server.shutdown=graceful +#server.error.whitelabel.enabled=false + +#spring.jackson.date-format=org.eclipse.digitaltwin.basyx.aasregistry.service.RFC3339DateFormat +#spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +#spring.profiles.active=logEvents,mongoDbStorage +spring.profiles.active=logEvents,inMemoryStorage + +#registry.type=mongodb + +basyx.cors.allowed-origins=* +basyx.cors.allowed-methods=GET,POST,PATCH,DELETE,PUT,OPTIONS,HEAD + +#spring.data.mongodb.uri=mongodb://mongoAdmin:mongoPassword@localhost:27017/dtr + +#basyx.backend = MongoDB + spring.data.mongodb.host=localhost +# or spring.data.mongodb.host=127.0.0.1 + spring.data.mongodb.port=27017 + spring.data.mongodb.database=dtr + spring.data.mongodb.authentication-database=admin + spring.data.mongodb.username=mongoAdmin + spring.data.mongodb.password=mongoPassword + +# basyx.aasrepository.feature.mqtt.enabled = true +# mqtt.clientId=TestClient +# mqtt.hostname = localhost +# mqtt.port = 1883 + +# basyx.cors.allowed-origins=http://localhost:3000, http://localhost:4000 +# basyx.cors.allowed-methods=GET,POST,PATCH,DELETE,PUT,OPTIONS,HEAD + +#################################################################################### +# Preconfiguring the Environment; +#################################################################################### +# Comma seperated list that contains Environment files to load on startup +# To load from Classpath (src/main/resources) use classpath:path/to/file.end +# To load from Filesystem ( On your local machine ) use the prefix file: +# +#basyx.environment = classpath:aas.aasx +# + +#################################################################################### +# Authorization +#################################################################################### +# basyx.feature.authorization.enabled = true +# basyx.feature.authorization.type = rbac +# basyx.feature.authorization.jwtBearerTokenProvider = keycloak +# basyx.feature.authorization.rbac.file = classpath:rbac_rules.json +# spring.security.oauth2.resourceserver.jwt.issuer-uri= http://localhost:9097/realms/BaSyx + +## This is for preconfiguration of a secured AAS Environment +# basyx.aasenvironment.authorization.preconfiguration.token-endpoint=http://localhost:9097/realms/BaSyx/protocol/openid-connect/token +# basyx.aasenvironment.authorization.preconfiguration.grant-type = CLIENT_CREDENTIALS +# basyx.aasenvironment.authorization.preconfiguration.client-id=workstation-1 +# basyx.aasenvironment.authorization.preconfiguration.client-secret=nY0mjyECF60DGzNmQUjL81XurSl8etom +# basyx.aasenvironment.authorization.preconfiguration.username=username +# basyx.aasenvironment.authorization.preconfiguration.password=password +# basyx.aasenvironment.authorization.preconfiguration.scopes= +#################################################################################### +# Operation Delegation +#################################################################################### +# This feature is enabled by default + +#basyx.submodelrepository.feature.operation.delegation.enabled = false + +#################################################################################### +# Max File Size +#################################################################################### +# To define the maximum size of file to be uploaded in a request (default 1 MB) + +# spring.servlet.multipart.max-file-size=128KB + +#################################################################################### +# Max Request Size +#################################################################################### +# To define the total request size for a multipart/form-data (default 10 MB) + +# spring.servlet.multipart.max-request-size=128KB \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/resources/banner.txt b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/resources/banner.txt new file mode 100644 index 000000000..11ca2c80e --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/main/resources/banner.txt @@ -0,0 +1,7 @@ + ____ ____ ____ _ _ _ _ _____ _ ____ _ _ + | __ ) __ _/ ___| _ ___ __ | _ \(_) __ _(_) |_ __ _| | |_ _|_ _(_)_ __ | _ \ ___ __ _(_)___| |_ _ __ _ _ + | _ \ / _` \___ \| | | \ \/ / | | | | |/ _` | | __/ _` | | | | \ \ /\ / / | '_ \ | |_) / _ \/ _` | / __| __| '__| | | | + | |_) | (_| |___) | |_| |> < | |_| | | (_| | | || (_| | | | | \ V V /| | | | | | _ < __/ (_| | \__ \ |_| | | |_| | + |____/ \__,_|____/ \__, /_/\_\ |____/|_|\__, |_|\__\__,_|_| |_| \_/\_/ |_|_| |_| |_| \_\___|\__, |_|___/\__|_| \__, | + |___/ |___/ |___/ |___/ +2.0.0-PREVIEW diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/BaSyx-Logo.png b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/BaSyx-Logo.png new file mode 100644 index 000000000..da613e94c Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/BaSyx-Logo.png differ diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application-mongodb.properties b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application-mongodb.properties new file mode 100644 index 000000000..18cb5c871 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application-mongodb.properties @@ -0,0 +1,13 @@ +basyx.backend = MongoDB + +spring.data.mongodb.host=127.0.0.1 +spring.data.mongodb.port=27017 +spring.data.mongodb.database=aas-env +spring.data.mongodb.authentication-database=admin +spring.data.mongodb.username=mongoAdmin +spring.data.mongodb.password=mongoPassword + +# default values +basyx.aasrepository.mongodb.collectionName=aas-repo +basyx.submodelrepository.mongodb.collectionName=submodel-repo +basyx.cdrepository.mongodb.collectionName=cd-repo \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application-reginteg.properties b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application-reginteg.properties new file mode 100644 index 000000000..ce166b3ec --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application-reginteg.properties @@ -0,0 +1,7 @@ +basyx.aasrepository.feature.registryintegration=http://localhost:8050 +basyx.submodelrepository.feature.registryintegration=http://localhost:8060 + +basyx.externalurl=http://localhost:8080 + +# Override for empty environment +basyx.environment= \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application.properties b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application.properties new file mode 100644 index 000000000..7123c9a50 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/application.properties @@ -0,0 +1,6 @@ +server.port=8080 +spring.application.name=AAS Environment + +basyx.backend = InMemory + +basyx.environment = classpath:testEnvironments,classpath:testEnvironment.json,classpath:testEnvironment.xml,classpath:testEnvironment.aasx diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.aasx b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.aasx new file mode 100644 index 000000000..9cd1b82d6 Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.aasx differ diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.json b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.json new file mode 100644 index 000000000..3e02f62f3 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.json @@ -0,0 +1,236 @@ +{ + "assetAdministrationShells": [ + { + "modelType": "AssetAdministrationShell", + "assetInformation": { + "assetKind": "Instance", + "globalAssetId": "https://acplt.test/Test_Asset" + }, + "derivedFrom": { + "keys": [ + { + "type": "AssetAdministrationShell", + "value": "https://acplt.test/TestAssetAdministrationShell" + } + ], + "type": "ExternalReference" + }, + "submodels": [ + { + "keys": [ + { + "type": "Submodel", + "value": "https://acplt.test/Test_Submodel" + } + ], + "type": "ExternalReference" + }, + { + "keys": [ + { + "type": "Submodel", + "value": "http://acplt.test/Submodels/Assets/TestAsset/BillOfMaterial" + } + ], + "type": "ExternalReference" + }, + { + "keys": [ + { + "type": "Submodel", + "value": "http://acplt.test/Submodels/Assets/TestAsset/Identification" + } + ], + "type": "ExternalReference" + } + ], + "administration": { + "revision": "9", + "version": "0" + }, + "id": "https://acplt.test/Test_AssetAdministrationShell", + "idShort": "TestAssetAdministrationShell", + "description": [ + { + "language": "en-us", + "text": "An Example Asset Administration Shell for the test application" + }, + { + "language": "de", + "text": "Ein Beispiel-Verwaltungsschale für eine Test-Anwendung" + } + ] + } + ], + "conceptDescriptions": [ + { + "modelType": "ConceptDescription", + "administration": { + "revision": "9", + "version": "0" + }, + "id": "https://acplt.test/Test_ConceptDescription", + "idShort": "TestConceptDescription", + "isCaseOf": [ + { + "keys": [ + { + "type": "GlobalReference", + "value": "http://acplt.test/DataSpecifications/Conceptdescription/TestConceptDescription" + } + ], + "type": "ExternalReference" + } + ], + "description": [ + { + "language": "en-us", + "text": "An example concept description for the test application" + }, + { + "language": "de", + "text": "Ein Beispiel-ConceptDescription für eine Test-Anwendung" + } + ] + } + ], + "submodels": [ + { + "modelType": "Submodel", + "kind": "Instance", + "semanticId": { + "keys": [ + { + "type": "Submodel", + "value": "http://acplt.test/SubmodelTemplates/AssetIdentification" + } + ], + "type": "ExternalReference" + }, + "administration": { + "revision": "9", + "version": "0" + }, + "id": "http://acplt.test/Submodels/Assets/TestAsset/Identification", + "idShort": "Identification", + "submodelElements": [ + { + "modelType": "Property", + "semanticId": { + "keys": [ + { + "type": "GlobalReference", + "value": "0173-1#02-AAO677#002" + } + ], + "type": "ExternalReference" + }, + "value": "http://acplt.test/ValueId/ACPLT", + "valueId": { + "keys": [ + { + "type": "GlobalReference", + "value": "http://acplt.test/ValueId/ACPLT" + } + ], + "type": "ExternalReference" + }, + "valueType": "xs:string", + "qualifiers": [ + { + "type": "http://acplt.test/Qualifier/ExampleQualifier", + "value": "100", + "valueType": "xs:int" + }, + { + "type": "http://acplt.test/Qualifier/ExampleQualifier2", + "value": "50", + "valueType": "xs:int" + } + ], + "idShort": "ManufacturerName", + "displayName": [ + { + "language": "en-us", + "text": "Manufacturer Name" + } + ], + "description": [ + { + "language": "en-us", + "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." + }, + { + "language": "de", + "text": "Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + } + ] + }, + { + "modelType": "Property", + "category": "VARIABLE", + "semanticId": { + "keys": [ + { + "type": "GlobalReference", + "value": "http://opcfoundation.test/UA/DI/1.1/DeviceType/Serialnumber" + } + ], + "type": "ExternalReference" + }, + "supplementalSemanticIds": [ + { + "keys": [ + { + "type": "GlobalReference", + "value": "something_random_e14ad770" + } + ], + "type": "ExternalReference" + }, + { + "keys": [{ + "type": "GlobalReference", + "value": "something_random_bd061acd" + }], + "type": "ExternalReference" + } + + ], + "value": "978-8234-234-342", + "valueId": { + "keys": [ + { + "type": "GlobalReference", + "value": "978-8234-234-342" + } + ], + "type": "ExternalReference" + }, + "valueType": "xs:string", + "idShort": "InstanceId", + "description": [ + { + "language": "en-us", + "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." + }, + { + "language": "de", + "text": "Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist" + } + ] + } + ], + "description": [ + { + "language": "en-us", + "text": "An example asset identification submodel for the test application" + }, + { + "language": "de", + "text": "Ein Beispiel-Identifikations-Submodel für eine Test-Anwendung" + } + ] + } + ] +} diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.xml b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.xml new file mode 100644 index 000000000..275ef0276 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironment.xml @@ -0,0 +1,450 @@ + + + + + ExampleMotor + http://customer.test/aas/9175_7013_7091_9168 + + Instance + http://customer.test/assets/KHBVZJSQKIY + + + EquipmentID + 538fd1b3-f99f-4a52-9c75-72e9fa921270 + + ExternalReference + + + GlobalReference + http://customer.test/Systems/ERP/012 + + + + + + DeviceID + QjYgPggjwkiHk4RrQiYSLg== + + ExternalReference + + + GlobalReference + http://customer.test/Systems/IoT/1 + + + + + + + file:///master/verwaltungsschale-detail-part1.png + image/png + + + + + ExternalReference + + + Submodel + http://i40.customer.test/type/1/1/7A7104BDAB57E184 + + + + + ExternalReference + + + Submodel + http://i40.customer.test/instance/1/1/AC69B1CB44F07935 + + + + + ExternalReference + + + Submodel + http://i40.customer.test/type/1/1/1A7B62B529F19152 + + + + + + + + + TechnicalData + http://i40.customer.test/type/1/1/7A7104BDAB57E184 + + ExternalReference + + + GlobalReference + 0173-1#01-AFZ615#016 + + + + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + + + Documentation + http://i40.customer.test/type/1/1/1A7B62B529F19152 + Instance + + + OperatingManual + + ExternalReference + + + ConceptDescription + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Document + + + + + + Title + + ExternalReference + + + ConceptDescription + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Description/Title + + + + xs:string + OperatingManual + + + DigitalFile_PDF + + ExternalReference + + + ConceptDescription + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/StoredDocumentRepresentation/DigitalFile + + + + file:///aasx/OperatingManual.pdf + application/pdf + + + + + + + OperationalData + http://i40.customer.test/instance/1/1/AC69B1CB44F07935 + Instance + + + VARIABLE + RotationSpeed + + ExternalReference + + + ConceptDescription + http://customer.test/cd/1/1/18EBD56F6B43D895 + + + + xs:integer + 4370 + + + + + + + Title + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Description/Title + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + EN + Title + + + DE + Titel + + + + + EN + Title + + + DE + Titel + + + ExampleString + ExampleString + STRING_TRANSLATABLE + + + EN + SprachabhängigerTiteldesDokuments. + + + + + + + + + DigitalFile + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/StoredDocumentRepresentation/DigitalFile + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + EN + DigitalFile + + + EN + DigitalFile + + + + + EN + DigitalFile + + + DE + DigitaleDatei + + + ExampleString + ExampleString + STRING + + + EN + A file representing the document version. In addition to the mandatory PDF file, other files can be specified. + + + + + + + + + PROPERTY + MaxRotationSpeed + + 2 + 1 + + 0173-1#02-BAA120#009 + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + de + max.Drehzahl + + + en + Max.rotationspeed + + + 1/min + + ExternalReference + + + GlobalReference + 0173-1#05-AAA650#002 + + + + ExampleString + REAL_MEASURE + + + de + HöchstezulässigeDrehzahl,mitwelcherderMotoroderdieSpeiseinheitbetriebenwerdendarf + + + EN + Greatestpermissiblerotationspeedwithwhichthemotororfeedingunitmaybeoperated + + + + + + + + + PROPERTY + RotationSpeed + http://customer.test/cd/1/1/18EBD56F6B43D895 + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + DE + AktuelleDrehzahl + + + EN + Actualrotationspeed + + + + + DE + AktuelleDrehzahl + + + EN + ActRotationSpeed + + + 1/min + + ExternalReference + + + GlobalReference + 0173-1#05-AAA650#002 + + + + ExampleString + REAL_MEASURE + + + DE + Aktuelle Drehzahl, mitwelcher der Motor oder die Speiseinheit betrieben wird + + + EN + Actual rotationspeed with which the motor or feedingunit is operated + + + + + + + + + Document + http://www.vdi2770.test/blatt1/Entwurf/Okt18/cd/Document + + + + ExternalReference + + + GlobalReference + https://admin-shell.io/aas/3/0/RC02/DataSpecificationIEC61360 + + + + + + + + EN + Document + + + + + EN + Document + + + DE + Dokument + + + ExampleString + [ISO15519-1:2010] + STRING + + + EN + Feste und geordnete Menge von für die Verwendung durch Personen bestimmte Informationen, die verwaltet und als Einheit zwischen Benutzern und System ausgetauscht werden kann. + + + + + + + + + + diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/a/testEnvironment.aasx b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/a/testEnvironment.aasx new file mode 100644 index 000000000..0f43391f7 Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/a/testEnvironment.aasx differ diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/b/testEnvironment.json b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/b/testEnvironment.json new file mode 100644 index 000000000..e5603247d --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/b/testEnvironment.json @@ -0,0 +1,357 @@ +{ + "assetAdministrationShells" : [ { + "modelType" : "AssetAdministrationShell", + "assetInformation" : { + "assetKind" : "Instance", + "globalAssetId" : "0173-1#01-AFZ615#016" + }, + "id" : "technical-data-shell-id-json", + "idShort" : "technical-data-shell-idShort-json" + }, { + "modelType" : "AssetAdministrationShell", + "assetInformation" : { + "assetKind" : "Instance", + "globalAssetId" : "square" + }, + "id" : "operational-data-shell-id-json", + "idShort" : "operational-data-shell-idShort-json" + } ], + "submodels" : [ { + "modelType" : "Submodel", + "id" : "7A7104BDAB57E184json", + "idShort" : "TechnicalData", + "submodelElements" : [ { + "modelType" : "Property", + "value" : "5000", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "MaxRotationSpeed", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Range", + "max" : "300", + "min" : "200", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "RotationSpeedRange", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "MultiLanguageProperty", + "category" : "PARAM", + "idShort" : "MultiLanguage", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + }, + "value" : [ { + "language" : "en", + "text" : "Hello" + }, { + "language" : "de", + "text" : "Hallo" + } ] + }, { + "modelType" : "File", + "contentType" : "application/json", + "value" : "testFile.json", + "category" : "PARAMETER", + "idShort" : "FileData", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Entity", + "entityType" : "CoManagedEntity", + "specificAssetIds" : [ { + "name" : "specificAssetIdName", + "value" : "specificValue" + } ], + "statements" : [ { + "modelType" : "Property", + "value" : "5000", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "MaxRotationSpeed", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Range", + "max" : "300", + "min" : "200", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "RotationSpeedRange", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + } ], + "category" : "Entity", + "idShort" : "EntityData", + "globalAssetId" : "globalAssetID", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "ReferenceElement", + "category" : "PARAMETER", + "idShort" : "ReferenceElement", + "value" : { + "keys" : [ { + "type" : "DataElement", + "value" : "DataElement" + } ], + "type" : "ModelReference" + }, + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "RelationshipElement", + "category" : "PARAMETER", + "idShort" : "RelationshipElement", + "first" : { + "keys" : [ { + "type" : "DataElement", + "value" : "DataElement" + } ], + "type" : "ModelReference" + }, + "second" : { + "keys" : [ { + "type" : "BasicEventElement", + "value" : "BasicEventElement" + } ], + "type" : "ExternalReference" + }, + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "AnnotatedRelationshipElement", + "category" : "PARAMETER", + "idShort" : "AnnotatedRelationshipElement", + "first" : { + "keys" : [ { + "type" : "DataElement", + "value" : "DataElement" + } ], + "type" : "ModelReference" + }, + "second" : { + "keys" : [ { + "type" : "BasicEventElement", + "value" : "BasicEventElement" + } ], + "type" : "ExternalReference" + }, + "annotations" : [ { + "modelType" : "Property", + "value" : "5000", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "MaxRotationSpeed", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Range", + "max" : "300", + "min" : "200", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "RotationSpeedRange", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + } ], + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Blob", + "contentType" : "application/xml", + "value" : "VGVzdCBjb250ZW50IG9mIFhNTCBmaWxl", + "category" : "PARAMETER", + "idShort" : "BlobData", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "SubmodelElementCollection", + "category" : "PARAMETER", + "idShort" : "SubmodelElementCollection", + "value" : [ { + "modelType" : "File", + "contentType" : "application/json", + "value" : "testFile.json", + "category" : "PARAMETER", + "idShort" : "FileData", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Property", + "value" : "5000", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "MaxRotationSpeed", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + } ], + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "SubmodelElementList", + "category" : "PARAMETER", + "idShort" : "SubmodelElementList", + "orderRelevant" : false, + "value" : [ { + "modelType" : "Range", + "max" : "300", + "min" : "200", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "RotationSpeedRange", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Property", + "value" : "5000", + "valueType" : "xs:integer", + "category" : "PARAMETER", + "idShort" : "MaxRotationSpeed", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + } ], + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "0173-1#02-BAA120#008" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Operation", + "idShort" : "square", + "inputVariables" : [ { + "value" : { + "modelType" : "Property", + "valueType" : "xs:int", + "idShort" : "input" + } + } ], + "outputVariables" : [ { + "value" : { + "modelType" : "Property", + "valueType" : "xs:int", + "idShort" : "result" + } + } ] + } ], + "semanticId" : { + "keys" : [ { + "type" : "GlobalReference", + "value" : "0173-1#01-AFZ615#016" + } ], + "type" : "ExternalReference" + } + }, { + "modelType" : "Submodel", + "id" : "AC69B1CB44F07935json", + "idShort" : "OperationalData", + "submodelElements" : [ { + "modelType" : "Property", + "value" : "4370", + "valueType" : "xs:integer", + "category" : "VARIABLE", + "idShort" : "RotationSpeed", + "semanticId" : { + "keys" : [ { + "type" : "ConceptDescription", + "value" : "http://customer.com/cd/1/1/18EBD56F6B43D895" + } ], + "type" : "ExternalReference" + } + } ] + } ] +} \ No newline at end of file diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/b/testEnvironment.xml b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/b/testEnvironment.xml new file mode 100644 index 000000000..a1b58c764 --- /dev/null +++ b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testEnvironments/b/testEnvironment.xml @@ -0,0 +1,427 @@ + + + + + technical-data-shell-idShort-xml + technical-data-shell-id-xml + + Instance + 0173-1#01-AFZ615#016 + + + + operational-data-shell-idShort-xml + operational-data-shell-id-xml + + Instance + square + + + + + + TechnicalData + 7A7104BDAB57E184xml + + ExternalReference + + + GlobalReference + 0173-1#01-AFZ615#016 + + + + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + PARAMETER + RotationSpeedRange + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 200 + 300 + + + PARAM + MultiLanguage + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + + + en + Hello + + + de + Hallo + + + + + PARAMETER + FileData + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + testFile.json + application/json + + + Entity + EntityData + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + PARAMETER + RotationSpeedRange + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 200 + 300 + + + CoManagedEntity + globalAssetID + + specificAssetIdName + specificValue + + + + PARAMETER + ReferenceElement + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + + ModelReference + + + DataElement + DataElement + + + + + + PARAMETER + RelationshipElement + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + + ModelReference + + + DataElement + DataElement + + + + + ExternalReference + + + BasicEventElement + BasicEventElement + + + + + + PARAMETER + AnnotatedRelationshipElement + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + + ModelReference + + + DataElement + DataElement + + + + + ExternalReference + + + BasicEventElement + BasicEventElement + + + + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + PARAMETER + RotationSpeedRange + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 200 + 300 + + + + + PARAMETER + BlobData + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + VGVzdCBjb250ZW50IG9mIFhNTCBmaWxl + application/xml + + + PARAMETER + SubmodelElementCollection + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + + + PARAMETER + FileData + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + testFile.json + application/json + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + + + PARAMETER + SubmodelElementList + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + false + + + PARAMETER + RotationSpeedRange + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 200 + 300 + + + PARAMETER + MaxRotationSpeed + + ExternalReference + + + ConceptDescription + 0173-1#02-BAA120#008 + + + + xs:integer + 5000 + + + + + square + + + + + input + xs:int + + + + + + + + + result + xs:int + + + + + + + + + OperationalData + AC69B1CB44F07935xml + + + VARIABLE + RotationSpeed + + ExternalReference + + + ConceptDescription + http://customer.com/cd/1/1/18EBD56F6B43D895 + + + + xs:integer + 4370 + + + + + diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testFiles/OperatingManual.pdf b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testFiles/OperatingManual.pdf new file mode 100644 index 000000000..6aa05ae76 Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testFiles/OperatingManual.pdf differ diff --git a/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testFiles/verwaltungsschale-detail-part1.png b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testFiles/verwaltungsschale-detail-part1.png new file mode 100644 index 000000000..a4219c52a Binary files /dev/null and b/basyx.digitaltwinregistry/basyx.digitaltwinregistry.component/src/test/resources/testFiles/verwaltungsschale-detail-part1.png differ diff --git a/basyx.digitaltwinregistry/pom.xml b/basyx.digitaltwinregistry/pom.xml new file mode 100644 index 000000000..4435720b7 --- /dev/null +++ b/basyx.digitaltwinregistry/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + + + org.eclipse.digitaltwin.basyx + basyx.parent + ${revision} + + + basyx.digitaltwinregistry + BaSyx Digital Twin Registry + BaSyx Digital Twin Registry + pom + + + basyx.digitaltwinregistry.component + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 36dd3ae3b..3dec08e0f 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ basyx.conceptdescriptionrepository basyx.aasxfileserver basyx.aasdiscoveryservice + basyx.digitaltwinregistry BaSyx Parent Parent POM for Eclipse BaSyx @@ -778,6 +779,47 @@ basyx.submodelregistry-client-native ${revision} + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service + ${revision} + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service-basemodel + ${revision} + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service-inmemory-storage + ${revision} + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service-mongodb-storage + ${revision} + + + org.eclipse.digitaltwin.basyx + basyx.aasregistry-service + ${revision} + + + + org.eclipse.digitaltwin.basyx + basyx.digitaltwinregistry + ${revision} + + + + org.eclipse.digitaltwin.basyx + basyx.digitaltwinregistry-component + ${revision} +