From af9d49df910da375c0749b3f7386e612571e3103 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 06:35:08 -0700 Subject: [PATCH 01/16] Squash merge --- .gencode_hash.txt | 14 +- bin/test_mosquitto | 17 +- gencode/docs/metadata.html | 360 ++++++++++++++++++ .../java/udmi/schema/LinkExternalsModel.java | 67 ++++ .../udmi/schema/LinkRelationshipsModel.java | 49 +++ gencode/java/udmi/schema/Metadata.java | 24 +- gencode/python/udmi/schema/__init__.py | 4 + gencode/python/udmi/schema/metadata.py | 10 + gencode/python/udmi/schema/model_externals.py | 35 ++ .../udmi/schema/model_externals_link.py | 46 +++ .../python/udmi/schema/model_relationships.py | 35 ++ .../udmi/schema/model_relationships_link.py | 38 ++ schema/metadata.json | 6 + schema/model_externals.json | 14 + schema/model_externals_link.json | 22 ++ schema/model_relationships.json | 14 + schema/model_relationships_link.json | 15 + .../devices/SNS-4/expected/metadata_norm.json | 26 +- tests/sites/basic/devices/SNS-4/metadata.json | 23 +- .../devices/DWN-2/expected/errors.map | 2 +- 20 files changed, 812 insertions(+), 9 deletions(-) create mode 100644 gencode/java/udmi/schema/LinkExternalsModel.java create mode 100644 gencode/java/udmi/schema/LinkRelationshipsModel.java create mode 100644 gencode/python/udmi/schema/model_externals.py create mode 100644 gencode/python/udmi/schema/model_externals_link.py create mode 100644 gencode/python/udmi/schema/model_relationships.py create mode 100644 gencode/python/udmi/schema/model_relationships_link.py create mode 100644 schema/model_externals.json create mode 100644 schema/model_externals_link.json create mode 100644 schema/model_relationships.json create mode 100644 schema/model_relationships_link.json diff --git a/.gencode_hash.txt b/.gencode_hash.txt index f5fd52deb7..4c74010418 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -13,7 +13,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -63a96f211b1da4e4650b32ba1af0def6067dcbbb0fc965663e6f305f6d14f468 gencode/docs/metadata.html +a103d202f53446f50afe9567acb5eeb2de2b3b55c1e1b961d926984973e3ab5e gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -81,6 +81,8 @@ b63fed8a190948ee3924946c1ad3bc9cf06fdeafc7cea0886bfe52e390448ddf gencode/java/u 175bdf9cc0b376b7f6c6b21174cb0ec568c49a1026e99bbdbc264b3cea7e7702 gencode/java/udmi/schema/IotAccess.java d0858bd7ba306176f4e3c19eeb69ef2467afec0832b6917b72d3ab87469e4974 gencode/java/udmi/schema/Jwt.java 5a0cc53317592a868f7f23a67a7493bd571054bb25d9e28de51000ad6473dfeb gencode/java/udmi/schema/Level.java +129a47bf6c5fc2b9be361a5effe2783c907f25ae78bab409a1fdc54ecdc90a55 gencode/java/udmi/schema/LinkExternalsModel.java +07c7d24e78e035026dfc568b2e269175bbd57f660c6617124d85e895cb159cb7 gencode/java/udmi/schema/LinkRelationshipsModel.java 6b4c29a682d0697d5420efb9e7788ec7358d94435da288938007205b8669e180 gencode/java/udmi/schema/LocalnetConfig.java 563bd616d4eb4201237ad356a144de80a4d0d1713701049009d0dbdab9fc37be gencode/java/udmi/schema/LocalnetModel.java b250808d1818cbe5366473cf814e9949c8c17dc4b5b2b281ba5845f3a696ba97 gencode/java/udmi/schema/LocalnetState.java @@ -91,7 +93,7 @@ ca932e3a0d0da213950aa89ad7a19d94505dd478bf196946aa93436c5c8b7512 gencode/java/u edbb091621a6f5e3f7e6804c7c30c0877fab0b0455661186f37b303ed108ff26 gencode/java/udmi/schema/MappingEvents.java 2742b162c3524152f3f5fce62015139295fab7cbf8f58beb7f8287ea5d294e7c gencode/java/udmi/schema/MappingState.java 8b15a8982ccadc52d52a8083cb9e101c73f2a48e069c4d41d6e59ea914352507 gencode/java/udmi/schema/MessageTemplateData.java -df82ad3f7d4229e41c39dde105a90e33732330ee2131b1f8e6907b69e62a69a3 gencode/java/udmi/schema/Metadata.java +a62d68e472aa154716452a14f2a9e87743002767dc45f76136f1c194e2a2187c gencode/java/udmi/schema/Metadata.java a64167bfcec809442cff132bb59ae0600055731407858656cc7147c3a38bb7cc gencode/java/udmi/schema/Metrics.java e986aff1efca08188441a246392f8c524c2cdaae107e475657402872a9a01561 gencode/java/udmi/schema/Monitoring.java 25210c7f94b6369c43c68ed1fefba1ab3dedfe3201352055c536fd5225a4c590 gencode/java/udmi/schema/MonitoringMetric.java @@ -144,7 +146,7 @@ eadc72e31b4796273479967303513b16563af0f946d1e1c7eba1748f9b133d40 gencode/java/u 5596535c39826e904949eed7894c3ecd1ee982d974beb7469f888965af2c7845 gencode/java/udmi/schema/VirtualEquipmentLinks.java 11f8dab5296d41e86cd623a4ed27b972ae673b141907cb913397d4eb53880c59 gencode/java/udmi/schema/Water.java d2a53a067185447ce672e5521cdb073a2b2100b9384b68e87211cafc5ef8cb2a gencode/presentation/presentation.json -4740049d54cbf7bc14c8a68fa92d9d5a5e4785d72da1239888173434a7f66305 gencode/python/udmi/schema/__init__.py +7ed3bec898da16f6b697aa0e688da47083d6fec0ef51b90b65f8c7943b78197a gencode/python/udmi/schema/__init__.py 25ae570fe5a988fd98a112fde81ceea440efb16b93dee58619fa532d98270879 gencode/python/udmi/schema/access_iot.py 4b25dd95f863059b761269f93adcae7049507924a1c6e74d6856849203c179db gencode/python/udmi/schema/ancillary_properties.py dab4f5fca272ec48c2881bca2b6bc43786ada47fa1f6dd935c35f7ce0eb6b0f6 gencode/python/udmi/schema/building_translation.py @@ -192,17 +194,21 @@ dc4bef0026ac8d9b0e5b13fe675b16df889e38671a7946371fe47d0443d82e4d gencode/python 0423bfd2158a71a1ce3961054aceacbe6603ad1f65a707b586d17bfabb2a99cb gencode/python/udmi/schema/events_udmi.py 8f4ec5b4d717a0c497e914a2e15c72d96bfd3bbb119fa3b1e21ac96243c195bd gencode/python/udmi/schema/events_validation.py 3707a9a5a07b7cf80e4ce6b0ca81584de74a9d5fe361214a4d3b6f22dd30cad8 gencode/python/udmi/schema/events_validation_device.py -08b264888144afa79f36b02cd3b855bf938afee5f519e84a37e4b8f18c94d6d5 gencode/python/udmi/schema/metadata.py +b6db8f2609fbcda488bb646b82e993557bfca6a5b2de5bd83640e48d105b7ad4 gencode/python/udmi/schema/metadata.py a947c8478dae5a245692d2d6de3044e9f7e57acad0b42fe774e9e5fb12fad335 gencode/python/udmi/schema/model_cloud.py 2ec91522178789a3d5ec27ad8ed13a94b8619139359dc3dcad9601b9adc1582d gencode/python/udmi/schema/model_cloud_config.py 387e3f68dad9ddd6211a4e10d25c35026a4c0083b606819fdb4e338be9e135ca gencode/python/udmi/schema/model_discovery.py ab4377d772bf11fa064ce74504af753a4cfac507a7c8f807b682f972353dbc5c gencode/python/udmi/schema/model_discovery_family.py +b93bc3d362dc995c63476dae1d6b1b818b84ebc5a220883c9fec356e183c9d9d gencode/python/udmi/schema/model_externals.py +0cfd7298040c51182d80923436ed178daacbd69847261b15d90824d621cd192e gencode/python/udmi/schema/model_externals_link.py bef91798566798ec70b2fe10ae52c909090de9095b92e2567da3cbdcec29cd2c gencode/python/udmi/schema/model_features.py 72d17ba53c9d537720bb0ddf24d615b838fc2b9bb2a5c288742a8d82c77bd85d gencode/python/udmi/schema/model_gateway.py 327ce1ecb1f3afbf4118c34ee5c68c8b7255a6e371711d3974c6155af82c0a43 gencode/python/udmi/schema/model_localnet.py bb9592bbc00e9654aa04c3eca2f23da10be80b00be5b2a766b12a0af9f624e7e gencode/python/udmi/schema/model_localnet_family.py cd4be21b66fb3e28dff96cfd39a878791ae8543f2fe67269b66c2c360d3f2513 gencode/python/udmi/schema/model_pointset.py d359ac9f69ba1ee4b14dff351f74edaa8649bd526d18ee309c9739b2d28e5341 gencode/python/udmi/schema/model_pointset_point.py +6e4c3659d8db41435424f149cf89c638bc5a47ee16339f1ac7dde60fb834b720 gencode/python/udmi/schema/model_relationships.py +45c423fd530625e24c9eb41db60692ceda9cd1df2810e82c22091b4ff8d422e3 gencode/python/udmi/schema/model_relationships_link.py 1d0ac251041143a508317dbe0d93f44425b1a40c144540f6ec9e573a75a1285f gencode/python/udmi/schema/model_system.py 15b349141ebae651c6c3c5c313b197d49c8b2b44e8ff1b0639848ad42e5c4e63 gencode/python/udmi/schema/model_system_hardware.py b48ae013d203eb31cc388a084c0cc6f93d4d5534336d4da2ecbccd84a085ea2b gencode/python/udmi/schema/model_testing.py diff --git a/bin/test_mosquitto b/bin/test_mosquitto index 642f337ebe..6944bdc31d 100755 --- a/bin/test_mosquitto +++ b/bin/test_mosquitto @@ -1,4 +1,4 @@ -#!/bin/bash -eu +#!/bin/bash -eux UDMI_ROOT=$(dirname $0)/.. cd $UDMI_ROOT @@ -116,8 +116,23 @@ echo Checking received end message fgrep Rudolph out/mosquitto.sub || fail did not find expected message echo Checking messages for matching serial no $serial_no +fgrep operational out/mosquitto.sub | wc -l +fgrep operational out/mosquitto.sub | head -n 1 +echo mark A && sleep 1 +fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' +echo mark B && sleep 1 +fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' > foo.json +echo mark C && sleep 1 +jq -r .system.serial_no foo.json || true +echo mark D && sleep 1 +fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' | jq -r .system.serial_no +echo mark E && sleep 1 received_no=$(fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' | jq -r .system.serial_no) +echo mark F && sleep 1 +echo received_no $received_no +echo mark G && sleep 1 received_topic=$(fgrep operational out/mosquitto.sub | head -n 1 | awk '{ print $1 }') +echo received_topic $received_topic [[ -z $received_topic ]] && fail No matching receive message found. expected_topic=/r/$registry_id/d/$device_id/state diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index 6f81fadc47..8ef010fdc4 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -3573,6 +3573,366 @@

+
+
+
+

+ +

+
+ +
+
+ +

Relationships Model

Type: object
+

Information for modeling noun-verb-noun relationships between devices

+
+ + No Additional Properties + + + + + + +
+
+
+

+ +

+
+ +
+

+ +

+

All properties whose name matches the following regular expression must respect the following conditions

+ Property name regular expression: ^[A-Z]{2,6}-[1-9][0-9]*$ +
+ +

Link Relationships Model

Type: object
+

Information about how this device links relationships to other devices

+
+ + No Additional Properties + + + + + + +
+
+
+

+ +

+
+ +
+
+ + Type: string
+

The kind of relationsihp between the two nodes

+
Must match regular expression: ^[a-z]+$ + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ +

+
+ +
+
+ +

Externals Model

Type: object
+

Information specific to how the device links with external models

+
+ + No Additional Properties + + + + + + +
+
+
+

+ +

+
+ +
+

+ +

+

All properties whose name matches the following regular expression must respect the following conditions

+ Property name regular expression: ^[a-z]+(_[a-z]+)*$ +
+ +

Link Externals Model

Type: object
+

Information about how this device links to a specific external model

+
+ + No Additional Properties + + + + + + +
+
+
+

+ +

+
+ +
+
+ + Type: string
+

Id of this device in the external model namespace

+
+ + + + + + +
+
+
+
+
+
+
+

+ +

+
+ +
+
+ + Type: string
+

Type of this device in the external model namespace

+
+ + + + + + +
+
+
+
+
+
+
+

+ +

+
+ +
+
+ + Type: string
+

Description of this device in the external model namespace

+
+ + + + + + +
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gencode/java/udmi/schema/LinkExternalsModel.java b/gencode/java/udmi/schema/LinkExternalsModel.java new file mode 100644 index 0000000000..76bfa6dad7 --- /dev/null +++ b/gencode/java/udmi/schema/LinkExternalsModel.java @@ -0,0 +1,67 @@ + +package udmi.schema; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyDescription; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + + +/** + * Link Externals Model + *

+ * Information about how this device links to a specific external model + * + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "entity_id", + "entity_type", + "description" +}) +public class LinkExternalsModel { + + /** + * Id of this device in the external model namespace + * + */ + @JsonProperty("entity_id") + @JsonPropertyDescription("Id of this device in the external model namespace") + public String entity_id; + /** + * Type of this device in the external model namespace + * + */ + @JsonProperty("entity_type") + @JsonPropertyDescription("Type of this device in the external model namespace") + public String entity_type; + /** + * Description of this device in the external model namespace + * + */ + @JsonProperty("description") + @JsonPropertyDescription("Description of this device in the external model namespace") + public String description; + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.entity_id == null)? 0 :this.entity_id.hashCode())); + result = ((result* 31)+((this.description == null)? 0 :this.description.hashCode())); + result = ((result* 31)+((this.entity_type == null)? 0 :this.entity_type.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof LinkExternalsModel) == false) { + return false; + } + LinkExternalsModel rhs = ((LinkExternalsModel) other); + return ((((this.entity_id == rhs.entity_id)||((this.entity_id!= null)&&this.entity_id.equals(rhs.entity_id)))&&((this.description == rhs.description)||((this.description!= null)&&this.description.equals(rhs.description))))&&((this.entity_type == rhs.entity_type)||((this.entity_type!= null)&&this.entity_type.equals(rhs.entity_type)))); + } + +} diff --git a/gencode/java/udmi/schema/LinkRelationshipsModel.java b/gencode/java/udmi/schema/LinkRelationshipsModel.java new file mode 100644 index 0000000000..aac21b80e4 --- /dev/null +++ b/gencode/java/udmi/schema/LinkRelationshipsModel.java @@ -0,0 +1,49 @@ + +package udmi.schema; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyDescription; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + + +/** + * Link Relationships Model + *

+ * Information about how this device links relationships to other devices + * + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "kind" +}) +public class LinkRelationshipsModel { + + /** + * The kind of relationsihp between the two nodes + * + */ + @JsonProperty("kind") + @JsonPropertyDescription("The kind of relationsihp between the two nodes") + public String kind; + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.kind == null)? 0 :this.kind.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof LinkRelationshipsModel) == false) { + return false; + } + LinkRelationshipsModel rhs = ((LinkRelationshipsModel) other); + return ((this.kind == rhs.kind)||((this.kind!= null)&&this.kind.equals(rhs.kind))); + } + +} diff --git a/gencode/java/udmi/schema/Metadata.java b/gencode/java/udmi/schema/Metadata.java index 22c9353077..68730d9d27 100644 --- a/gencode/java/udmi/schema/Metadata.java +++ b/gencode/java/udmi/schema/Metadata.java @@ -25,6 +25,8 @@ "operation", "cloud", "system", + "relationships", + "externals", "gateway", "discovery", "localnet", @@ -92,6 +94,24 @@ public class Metadata { @JsonProperty("system") @JsonPropertyDescription("High-level system information about the device. [System Model Documentation](../docs/messages/system.md)") public SystemModel system; + /** + * Relationships Model + *

+ * Information for modeling noun-verb-noun relationships between devices + * + */ + @JsonProperty("relationships") + @JsonPropertyDescription("Information for modeling noun-verb-noun relationships between devices") + public Map relationships; + /** + * Externals Model + *

+ * Information specific to how the device links with external models + * + */ + @JsonProperty("externals") + @JsonPropertyDescription("Information specific to how the device links with external models") + public Map externals; /** * Gateway Model *

@@ -156,11 +176,13 @@ public int hashCode() { result = ((result* 31)+((this.version == null)? 0 :this.version.hashCode())); result = ((result* 31)+((this.structure == null)? 0 :this.structure.hashCode())); result = ((result* 31)+((this.cloud == null)? 0 :this.cloud.hashCode())); + result = ((result* 31)+((this.relationships == null)? 0 :this.relationships.hashCode())); result = ((result* 31)+((this.features == null)? 0 :this.features.hashCode())); result = ((result* 31)+((this.system == null)? 0 :this.system.hashCode())); result = ((result* 31)+((this.discovery == null)? 0 :this.discovery.hashCode())); result = ((result* 31)+((this.upgraded_from == null)? 0 :this.upgraded_from.hashCode())); result = ((result* 31)+((this.pointset == null)? 0 :this.pointset.hashCode())); + result = ((result* 31)+((this.externals == null)? 0 :this.externals.hashCode())); result = ((result* 31)+((this.operation == null)? 0 :this.operation.hashCode())); result = ((result* 31)+((this.hash == null)? 0 :this.hash.hashCode())); result = ((result* 31)+((this.gateway == null)? 0 :this.gateway.hashCode())); @@ -178,7 +200,7 @@ public boolean equals(Object other) { return false; } Metadata rhs = ((Metadata) other); - return (((((((((((((((this.testing == rhs.testing)||((this.testing!= null)&&this.testing.equals(rhs.testing)))&&((this.version == rhs.version)||((this.version!= null)&&this.version.equals(rhs.version))))&&((this.structure == rhs.structure)||((this.structure!= null)&&this.structure.equals(rhs.structure))))&&((this.cloud == rhs.cloud)||((this.cloud!= null)&&this.cloud.equals(rhs.cloud))))&&((this.features == rhs.features)||((this.features!= null)&&this.features.equals(rhs.features))))&&((this.system == rhs.system)||((this.system!= null)&&this.system.equals(rhs.system))))&&((this.discovery == rhs.discovery)||((this.discovery!= null)&&this.discovery.equals(rhs.discovery))))&&((this.upgraded_from == rhs.upgraded_from)||((this.upgraded_from!= null)&&this.upgraded_from.equals(rhs.upgraded_from))))&&((this.pointset == rhs.pointset)||((this.pointset!= null)&&this.pointset.equals(rhs.pointset))))&&((this.operation == rhs.operation)||((this.operation!= null)&&this.operation.equals(rhs.operation))))&&((this.hash == rhs.hash)||((this.hash!= null)&&this.hash.equals(rhs.hash))))&&((this.gateway == rhs.gateway)||((this.gateway!= null)&&this.gateway.equals(rhs.gateway))))&&((this.localnet == rhs.localnet)||((this.localnet!= null)&&this.localnet.equals(rhs.localnet))))&&((this.timestamp == rhs.timestamp)||((this.timestamp!= null)&&this.timestamp.equals(rhs.timestamp)))); + return (((((((((((((((((this.testing == rhs.testing)||((this.testing!= null)&&this.testing.equals(rhs.testing)))&&((this.version == rhs.version)||((this.version!= null)&&this.version.equals(rhs.version))))&&((this.structure == rhs.structure)||((this.structure!= null)&&this.structure.equals(rhs.structure))))&&((this.cloud == rhs.cloud)||((this.cloud!= null)&&this.cloud.equals(rhs.cloud))))&&((this.relationships == rhs.relationships)||((this.relationships!= null)&&this.relationships.equals(rhs.relationships))))&&((this.features == rhs.features)||((this.features!= null)&&this.features.equals(rhs.features))))&&((this.system == rhs.system)||((this.system!= null)&&this.system.equals(rhs.system))))&&((this.discovery == rhs.discovery)||((this.discovery!= null)&&this.discovery.equals(rhs.discovery))))&&((this.upgraded_from == rhs.upgraded_from)||((this.upgraded_from!= null)&&this.upgraded_from.equals(rhs.upgraded_from))))&&((this.pointset == rhs.pointset)||((this.pointset!= null)&&this.pointset.equals(rhs.pointset))))&&((this.externals == rhs.externals)||((this.externals!= null)&&this.externals.equals(rhs.externals))))&&((this.operation == rhs.operation)||((this.operation!= null)&&this.operation.equals(rhs.operation))))&&((this.hash == rhs.hash)||((this.hash!= null)&&this.hash.equals(rhs.hash))))&&((this.gateway == rhs.gateway)||((this.gateway!= null)&&this.gateway.equals(rhs.gateway))))&&((this.localnet == rhs.localnet)||((this.localnet!= null)&&this.localnet.equals(rhs.localnet))))&&((this.timestamp == rhs.timestamp)||((this.timestamp!= null)&&this.timestamp.equals(rhs.timestamp)))); } } diff --git a/gencode/python/udmi/schema/__init__.py b/gencode/python/udmi/schema/__init__.py index cf31887d5f..1763771672 100644 --- a/gencode/python/udmi/schema/__init__.py +++ b/gencode/python/udmi/schema/__init__.py @@ -50,12 +50,16 @@ from .model_cloud_config import CloudConfigModel from .model_discovery import DiscoveryModel from .model_discovery_family import FamilyDiscoveryModel +from .model_externals import ExternalsModel +from .model_externals_link import LinkExternalsModel from .model_features import TestingModel from .model_gateway import GatewayModel from .model_localnet import LocalnetModel from .model_localnet_family import FamilyLocalnetModel from .model_pointset import PointsetModel from .model_pointset_point import PointPointsetModel +from .model_relationships import RelationshipsModel +from .model_relationships_link import LinkRelationshipsModel from .model_system import SystemModel from .model_system_hardware import SystemHardware from .model_testing import TestingModel diff --git a/gencode/python/udmi/schema/metadata.py b/gencode/python/udmi/schema/metadata.py index 57ea6c507d..95550e27fc 100644 --- a/gencode/python/udmi/schema/metadata.py +++ b/gencode/python/udmi/schema/metadata.py @@ -1,6 +1,8 @@ """Generated class for metadata.json""" from .model_cloud import CloudModel from .model_system import SystemModel +from .model_relationships import RelationshipsModel +from .model_externals import ExternalsModel from .model_gateway import GatewayModel from .model_discovery import DiscoveryModel from .model_localnet import LocalnetModel @@ -21,6 +23,8 @@ def __init__(self): self.operation = None self.cloud = None self.system = None + self.relationships = None + self.externals = None self.gateway = None self.discovery = None self.localnet = None @@ -41,6 +45,8 @@ def from_dict(source): result.operation = source.get('operation') result.cloud = CloudModel.from_dict(source.get('cloud')) result.system = SystemModel.from_dict(source.get('system')) + result.relationships = LinkRelationshipsModel.map_from(source.get('relationships')) + result.externals = LinkExternalsModel.map_from(source.get('externals')) result.gateway = GatewayModel.from_dict(source.get('gateway')) result.discovery = DiscoveryModel.from_dict(source.get('discovery')) result.localnet = LocalnetModel.from_dict(source.get('localnet')) @@ -82,6 +88,10 @@ def to_dict(self): result['cloud'] = self.cloud.to_dict() # 4 if self.system: result['system'] = self.system.to_dict() # 4 + if self.relationships: + result['relationships'] = LinkRelationshipsModel.expand_dict(self.relationships) # 2 + if self.externals: + result['externals'] = LinkExternalsModel.expand_dict(self.externals) # 2 if self.gateway: result['gateway'] = self.gateway.to_dict() # 4 if self.discovery: diff --git a/gencode/python/udmi/schema/model_externals.py b/gencode/python/udmi/schema/model_externals.py new file mode 100644 index 0000000000..c5cbee13c2 --- /dev/null +++ b/gencode/python/udmi/schema/model_externals.py @@ -0,0 +1,35 @@ +"""Generated class for model_externals.json""" + + +class ExternalsModel: + """Generated schema class""" + + def __init__(self): + pass + + @staticmethod + def from_dict(source): + if not source: + return None + result = ExternalsModel() + return result + + @staticmethod + def map_from(source): + if not source: + return None + result = {} + for key in source: + result[key] = ExternalsModel.from_dict(source[key]) + return result + + @staticmethod + def expand_dict(input): + result = {} + for property in input: + result[property] = input[property].to_dict() if input[property] else {} + return result + + def to_dict(self): + result = {} + return result diff --git a/gencode/python/udmi/schema/model_externals_link.py b/gencode/python/udmi/schema/model_externals_link.py new file mode 100644 index 0000000000..8979c982da --- /dev/null +++ b/gencode/python/udmi/schema/model_externals_link.py @@ -0,0 +1,46 @@ +"""Generated class for model_externals_link.json""" + + +class LinkExternalsModel: + """Generated schema class""" + + def __init__(self): + self.entity_id = None + self.entity_type = None + self.description = None + + @staticmethod + def from_dict(source): + if not source: + return None + result = LinkExternalsModel() + result.entity_id = source.get('entity_id') + result.entity_type = source.get('entity_type') + result.description = source.get('description') + return result + + @staticmethod + def map_from(source): + if not source: + return None + result = {} + for key in source: + result[key] = LinkExternalsModel.from_dict(source[key]) + return result + + @staticmethod + def expand_dict(input): + result = {} + for property in input: + result[property] = input[property].to_dict() if input[property] else {} + return result + + def to_dict(self): + result = {} + if self.entity_id: + result['entity_id'] = self.entity_id # 5 + if self.entity_type: + result['entity_type'] = self.entity_type # 5 + if self.description: + result['description'] = self.description # 5 + return result diff --git a/gencode/python/udmi/schema/model_relationships.py b/gencode/python/udmi/schema/model_relationships.py new file mode 100644 index 0000000000..6d3bc7170c --- /dev/null +++ b/gencode/python/udmi/schema/model_relationships.py @@ -0,0 +1,35 @@ +"""Generated class for model_relationships.json""" + + +class RelationshipsModel: + """Generated schema class""" + + def __init__(self): + pass + + @staticmethod + def from_dict(source): + if not source: + return None + result = RelationshipsModel() + return result + + @staticmethod + def map_from(source): + if not source: + return None + result = {} + for key in source: + result[key] = RelationshipsModel.from_dict(source[key]) + return result + + @staticmethod + def expand_dict(input): + result = {} + for property in input: + result[property] = input[property].to_dict() if input[property] else {} + return result + + def to_dict(self): + result = {} + return result diff --git a/gencode/python/udmi/schema/model_relationships_link.py b/gencode/python/udmi/schema/model_relationships_link.py new file mode 100644 index 0000000000..0a9c2b572e --- /dev/null +++ b/gencode/python/udmi/schema/model_relationships_link.py @@ -0,0 +1,38 @@ +"""Generated class for model_relationships_link.json""" + + +class LinkRelationshipsModel: + """Generated schema class""" + + def __init__(self): + self.kind = None + + @staticmethod + def from_dict(source): + if not source: + return None + result = LinkRelationshipsModel() + result.kind = source.get('kind') + return result + + @staticmethod + def map_from(source): + if not source: + return None + result = {} + for key in source: + result[key] = LinkRelationshipsModel.from_dict(source[key]) + return result + + @staticmethod + def expand_dict(input): + result = {} + for property in input: + result[property] = input[property].to_dict() if input[property] else {} + return result + + def to_dict(self): + result = {} + if self.kind: + result['kind'] = self.kind # 5 + return result diff --git a/schema/metadata.json b/schema/metadata.json index 7d11503cdc..8bdd6a79be 100644 --- a/schema/metadata.json +++ b/schema/metadata.json @@ -47,6 +47,12 @@ "section": "system" } }, + "relationships": { + "$ref": "file:model_relationships.json#" + }, + "externals": { + "$ref": "file:model_externals.json#" + }, "gateway": { "$ref": "file:model_gateway.json#", "$presentation": { diff --git a/schema/model_externals.json b/schema/model_externals.json new file mode 100644 index 0000000000..91fdbca0a2 --- /dev/null +++ b/schema/model_externals.json @@ -0,0 +1,14 @@ +{ + "$udmi_version": "1.5.3", + "title": "Externals Model", + "description": "Information specific to how the device links with external models", + "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "existingJavaType": "java.util.Map", + "patternProperties": { + "^[a-z]+(_[a-z]+)*$": { + "$ref": "file:model_externals_link.json" + } + } +} diff --git a/schema/model_externals_link.json b/schema/model_externals_link.json new file mode 100644 index 0000000000..ebecea37c3 --- /dev/null +++ b/schema/model_externals_link.json @@ -0,0 +1,22 @@ +{ + "$udmi_version": "1.5.3", + "title": "Link Externals Model", + "description": "Information about how this device links to a specific external model", + "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "entity_id": { + "description": "Id of this device in the external model namespace", + "type": "string" + }, + "entity_type": { + "description": "Type of this device in the external model namespace", + "type": "string" + }, + "description": { + "description": "Description of this device in the external model namespace", + "type": "string" + } + } +} diff --git a/schema/model_relationships.json b/schema/model_relationships.json new file mode 100644 index 0000000000..23a967ca5f --- /dev/null +++ b/schema/model_relationships.json @@ -0,0 +1,14 @@ +{ + "$udmi_version": "1.5.3", + "title": "Relationships Model", + "description": "Information for modeling noun-verb-noun relationships between devices", + "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "existingJavaType": "java.util.Map", + "patternProperties": { + "^[A-Z]{2,6}-[1-9][0-9]*$": { + "$ref": "file:model_relationships_link.json" + } + } +} diff --git a/schema/model_relationships_link.json b/schema/model_relationships_link.json new file mode 100644 index 0000000000..dfbf1a04d3 --- /dev/null +++ b/schema/model_relationships_link.json @@ -0,0 +1,15 @@ +{ + "$udmi_version": "1.5.3", + "title": "Link Relationships Model", + "description": "Information about how this device links relationships to other devices", + "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "kind": { + "description": "The kind of relationsihp between the two nodes", + "pattern": "^[a-z]+$", + "type": "string" + } + } +} diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json index 64395687fe..d742f48bc6 100644 --- a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json +++ b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json @@ -1,8 +1,23 @@ { + "externals": { + "dbo": { + "description": "VAV CO 1-2-37", + "entity_id": "0060917f-8c21-47c4-b011-52521085fdc3", + "entity_type": "HVAC/VAV_SD_DSP" + }, + "ifc": { + "entity_id": "a87a9b4b-e9e5-424b-9a4e-22378987dddd", + "entity_type": "IfcDoor" + }, + "json_ld": { + "entity_id": "https://dbpedia.org/page/John_Lennon", + "entity_type": "person" + } + }, "gateway": { "gateway_id": "GAT-123" }, - "hash": "539a2745", + "hash": "87373df9", "pointset": { "exclude_points_from_config": true, "points": { @@ -15,6 +30,15 @@ }, "sample_rate_sec": 30 }, + "relationships": { + "AHU-1": { + "kind": "feeds" + }, + "AHU-22": {}, + "SNS-4": { + "kind": "contains" + } + }, "system": { "location": { "section": "2-3N8C", diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index 13a6be81b4..3ee89c7d47 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -6,7 +6,8 @@ "units": "Degrees-phase" }, "split_threshold": { - "units": "Imperial-gallons-per-minute" + "units": "Imperial-gallons-per-minute", + "ref": "iot://SNS-22/split_threshold" } } }, @@ -22,6 +23,26 @@ } } }, + "relationships": { + "AHU-1": { "kind": "feeds" }, + "AHU-22": {}, + "SNS-4": { "kind": "contains" } + }, + "externals": { + "dbo": { + "entity_id": "0060917f-8c21-47c4-b011-52521085fdc3", + "entity_type": "HVAC/VAV_SD_DSP", + "description": "VAV CO 1-2-37" + }, + "ifc": { + "entity_id": "a87a9b4b-e9e5-424b-9a4e-22378987dddd", + "entity_type": "IfcDoor" + }, + "json_ld": { + "entity_id": "https://dbpedia.org/page/John_Lennon", + "entity_type": "person" + } + }, "gateway": { "gateway_id": "GAT-123" }, diff --git a/tests/sites/downgrade/devices/DWN-2/expected/errors.map b/tests/sites/downgrade/devices/DWN-2/expected/errors.map index 2c430d233d..2e859cb2be 100644 --- a/tests/sites/downgrade/devices/DWN-2/expected/errors.map +++ b/tests/sites/downgrade/devices/DWN-2/expected/errors.map @@ -2,4 +2,4 @@ Exceptions for DWN-2 While loading device metadata for DWN-2 While converting strict to udmi.schema.Metadata While converting string/string to udmi.schema.Metadata - Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (14 known properties: "upgraded_from", "gateway", "operation", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) + Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "external", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) From d3418860f3128b660f0c1b0ebf57f50e59558e83 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 06:36:09 -0700 Subject: [PATCH 02/16] CHange order --- tests/sites/basic/devices/SNS-4/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index 3ee89c7d47..c0a9f98e9e 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -6,8 +6,8 @@ "units": "Degrees-phase" }, "split_threshold": { - "units": "Imperial-gallons-per-minute", - "ref": "iot://SNS-22/split_threshold" + "ref": "iot://SNS-22/split_threshold", + "units": "Imperial-gallons-per-minute" } } }, From 314656dcef7ff06717de4e2bf25da69cd0e852be Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 07:16:47 -0700 Subject: [PATCH 03/16] Adding etags --- .gencode_hash.txt | 6 +-- gencode/docs/metadata.html | 48 +++++++++++++++++++ .../java/udmi/schema/LinkExternalsModel.java | 13 ++++- .../udmi/schema/model_externals_link.py | 4 ++ schema/model_externals_link.json | 5 ++ .../devices/SNS-4/expected/metadata_norm.json | 6 ++- tests/sites/basic/devices/SNS-4/metadata.json | 1 + 7 files changed, 76 insertions(+), 7 deletions(-) diff --git a/.gencode_hash.txt b/.gencode_hash.txt index 4c74010418..f6ba82dc45 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -13,7 +13,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -a103d202f53446f50afe9567acb5eeb2de2b3b55c1e1b961d926984973e3ab5e gencode/docs/metadata.html +72c8fa2e566b6f18e018de144b9ed88a259eff639f2b0b2fc112f468bc05a0b0 gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -81,7 +81,7 @@ b63fed8a190948ee3924946c1ad3bc9cf06fdeafc7cea0886bfe52e390448ddf gencode/java/u 175bdf9cc0b376b7f6c6b21174cb0ec568c49a1026e99bbdbc264b3cea7e7702 gencode/java/udmi/schema/IotAccess.java d0858bd7ba306176f4e3c19eeb69ef2467afec0832b6917b72d3ab87469e4974 gencode/java/udmi/schema/Jwt.java 5a0cc53317592a868f7f23a67a7493bd571054bb25d9e28de51000ad6473dfeb gencode/java/udmi/schema/Level.java -129a47bf6c5fc2b9be361a5effe2783c907f25ae78bab409a1fdc54ecdc90a55 gencode/java/udmi/schema/LinkExternalsModel.java +a6e7a378cb6b1223957cc268fa7259dc488de7cff91100f8920f6c2058d81f6b gencode/java/udmi/schema/LinkExternalsModel.java 07c7d24e78e035026dfc568b2e269175bbd57f660c6617124d85e895cb159cb7 gencode/java/udmi/schema/LinkRelationshipsModel.java 6b4c29a682d0697d5420efb9e7788ec7358d94435da288938007205b8669e180 gencode/java/udmi/schema/LocalnetConfig.java 563bd616d4eb4201237ad356a144de80a4d0d1713701049009d0dbdab9fc37be gencode/java/udmi/schema/LocalnetModel.java @@ -200,7 +200,7 @@ a947c8478dae5a245692d2d6de3044e9f7e57acad0b42fe774e9e5fb12fad335 gencode/python 387e3f68dad9ddd6211a4e10d25c35026a4c0083b606819fdb4e338be9e135ca gencode/python/udmi/schema/model_discovery.py ab4377d772bf11fa064ce74504af753a4cfac507a7c8f807b682f972353dbc5c gencode/python/udmi/schema/model_discovery_family.py b93bc3d362dc995c63476dae1d6b1b818b84ebc5a220883c9fec356e183c9d9d gencode/python/udmi/schema/model_externals.py -0cfd7298040c51182d80923436ed178daacbd69847261b15d90824d621cd192e gencode/python/udmi/schema/model_externals_link.py +1c5fac6ae9f0242e766c004df54bca8e50d433c312b37d45bbda30629745204e gencode/python/udmi/schema/model_externals_link.py bef91798566798ec70b2fe10ae52c909090de9095b92e2567da3cbdcec29cd2c gencode/python/udmi/schema/model_features.py 72d17ba53c9d537720bb0ddf24d615b838fc2b9bb2a5c288742a8d82c77bd85d gencode/python/udmi/schema/model_gateway.py 327ce1ecb1f3afbf4118c34ee5c68c8b7255a6e371711d3974c6155af82c0a43 gencode/python/udmi/schema/model_localnet.py diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index 8ef010fdc4..fd330a8c99 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -3873,6 +3873,54 @@

+

+
+
+ +
+
+
+

+ +

+
+ +
+
+ + Type: string
+

Etag for referencing this external entity

+
Must match regular expression: ^[0-9a-f]+$ + + + + + +
diff --git a/gencode/java/udmi/schema/LinkExternalsModel.java b/gencode/java/udmi/schema/LinkExternalsModel.java index 76bfa6dad7..15ad9fd8e6 100644 --- a/gencode/java/udmi/schema/LinkExternalsModel.java +++ b/gencode/java/udmi/schema/LinkExternalsModel.java @@ -17,6 +17,7 @@ @JsonPropertyOrder({ "entity_id", "entity_type", + "etag", "description" }) public class LinkExternalsModel { @@ -35,6 +36,13 @@ public class LinkExternalsModel { @JsonProperty("entity_type") @JsonPropertyDescription("Type of this device in the external model namespace") public String entity_type; + /** + * Etag for referencing this external entity + * + */ + @JsonProperty("etag") + @JsonPropertyDescription("Etag for referencing this external entity") + public String etag; /** * Description of this device in the external model namespace * @@ -46,9 +54,10 @@ public class LinkExternalsModel { @Override public int hashCode() { int result = 1; - result = ((result* 31)+((this.entity_id == null)? 0 :this.entity_id.hashCode())); result = ((result* 31)+((this.description == null)? 0 :this.description.hashCode())); + result = ((result* 31)+((this.etag == null)? 0 :this.etag.hashCode())); result = ((result* 31)+((this.entity_type == null)? 0 :this.entity_type.hashCode())); + result = ((result* 31)+((this.entity_id == null)? 0 :this.entity_id.hashCode())); return result; } @@ -61,7 +70,7 @@ public boolean equals(Object other) { return false; } LinkExternalsModel rhs = ((LinkExternalsModel) other); - return ((((this.entity_id == rhs.entity_id)||((this.entity_id!= null)&&this.entity_id.equals(rhs.entity_id)))&&((this.description == rhs.description)||((this.description!= null)&&this.description.equals(rhs.description))))&&((this.entity_type == rhs.entity_type)||((this.entity_type!= null)&&this.entity_type.equals(rhs.entity_type)))); + return (((((this.description == rhs.description)||((this.description!= null)&&this.description.equals(rhs.description)))&&((this.etag == rhs.etag)||((this.etag!= null)&&this.etag.equals(rhs.etag))))&&((this.entity_type == rhs.entity_type)||((this.entity_type!= null)&&this.entity_type.equals(rhs.entity_type))))&&((this.entity_id == rhs.entity_id)||((this.entity_id!= null)&&this.entity_id.equals(rhs.entity_id)))); } } diff --git a/gencode/python/udmi/schema/model_externals_link.py b/gencode/python/udmi/schema/model_externals_link.py index 8979c982da..a7d30348c0 100644 --- a/gencode/python/udmi/schema/model_externals_link.py +++ b/gencode/python/udmi/schema/model_externals_link.py @@ -7,6 +7,7 @@ class LinkExternalsModel: def __init__(self): self.entity_id = None self.entity_type = None + self.etag = None self.description = None @staticmethod @@ -16,6 +17,7 @@ def from_dict(source): result = LinkExternalsModel() result.entity_id = source.get('entity_id') result.entity_type = source.get('entity_type') + result.etag = source.get('etag') result.description = source.get('description') return result @@ -41,6 +43,8 @@ def to_dict(self): result['entity_id'] = self.entity_id # 5 if self.entity_type: result['entity_type'] = self.entity_type # 5 + if self.etag: + result['etag'] = self.etag # 5 if self.description: result['description'] = self.description # 5 return result diff --git a/schema/model_externals_link.json b/schema/model_externals_link.json index ebecea37c3..478b3b6aac 100644 --- a/schema/model_externals_link.json +++ b/schema/model_externals_link.json @@ -14,6 +14,11 @@ "description": "Type of this device in the external model namespace", "type": "string" }, + "etag": { + "description": "Etag for referencing this external entity", + "pattern": "^[0-9a-f]+$", + "type": "string" + }, "description": { "description": "Description of this device in the external model namespace", "type": "string" diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json index d742f48bc6..0bee37b88a 100644 --- a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json +++ b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json @@ -7,7 +7,8 @@ }, "ifc": { "entity_id": "a87a9b4b-e9e5-424b-9a4e-22378987dddd", - "entity_type": "IfcDoor" + "entity_type": "IfcDoor", + "etag": "98bac980" }, "json_ld": { "entity_id": "https://dbpedia.org/page/John_Lennon", @@ -17,11 +18,12 @@ "gateway": { "gateway_id": "GAT-123" }, - "hash": "87373df9", + "hash": "bbaa3721", "pointset": { "exclude_points_from_config": true, "points": { "split_threshold": { + "ref": "iot://SNS-22/split_threshold", "units": "Imperial-gallons-per-minute" }, "triangulating_axis": { diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index c0a9f98e9e..24e119f169 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -36,6 +36,7 @@ }, "ifc": { "entity_id": "a87a9b4b-e9e5-424b-9a4e-22378987dddd", + "etag": "98bac980", "entity_type": "IfcDoor" }, "json_ld": { From 4e24d70991f58aaffdf6b1f7a76dc5b3d4aa193f Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 10:02:49 -0700 Subject: [PATCH 04/16] Making relationships an array --- .gencode_hash.txt | 8 +-- gencode/docs/metadata.html | 68 +++++++++++++++---- .../udmi/schema/LinkRelationshipsModel.java | 3 +- gencode/java/udmi/schema/Metadata.java | 3 +- gencode/python/udmi/schema/metadata.py | 4 +- schema/model_relationships.json | 7 +- schema/model_relationships_link.json | 9 ++- .../devices/SNS-4/expected/metadata_norm.json | 20 +++--- tests/sites/basic/devices/SNS-4/metadata.json | 6 +- 9 files changed, 91 insertions(+), 37 deletions(-) diff --git a/.gencode_hash.txt b/.gencode_hash.txt index f6ba82dc45..a9284674f8 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -13,7 +13,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -72c8fa2e566b6f18e018de144b9ed88a259eff639f2b0b2fc112f468bc05a0b0 gencode/docs/metadata.html +f545782cc954425cfe6d12171b8ee40fbfef76ac70a810c8f2cb6e7cfc3d5784 gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -82,7 +82,7 @@ b63fed8a190948ee3924946c1ad3bc9cf06fdeafc7cea0886bfe52e390448ddf gencode/java/u d0858bd7ba306176f4e3c19eeb69ef2467afec0832b6917b72d3ab87469e4974 gencode/java/udmi/schema/Jwt.java 5a0cc53317592a868f7f23a67a7493bd571054bb25d9e28de51000ad6473dfeb gencode/java/udmi/schema/Level.java a6e7a378cb6b1223957cc268fa7259dc488de7cff91100f8920f6c2058d81f6b gencode/java/udmi/schema/LinkExternalsModel.java -07c7d24e78e035026dfc568b2e269175bbd57f660c6617124d85e895cb159cb7 gencode/java/udmi/schema/LinkRelationshipsModel.java +552ef16a01f607e2a85db092656c8e7e8697c7c5a3fbe2d381925cf9463d65cf gencode/java/udmi/schema/LinkRelationshipsModel.java 6b4c29a682d0697d5420efb9e7788ec7358d94435da288938007205b8669e180 gencode/java/udmi/schema/LocalnetConfig.java 563bd616d4eb4201237ad356a144de80a4d0d1713701049009d0dbdab9fc37be gencode/java/udmi/schema/LocalnetModel.java b250808d1818cbe5366473cf814e9949c8c17dc4b5b2b281ba5845f3a696ba97 gencode/java/udmi/schema/LocalnetState.java @@ -93,7 +93,7 @@ ca932e3a0d0da213950aa89ad7a19d94505dd478bf196946aa93436c5c8b7512 gencode/java/u edbb091621a6f5e3f7e6804c7c30c0877fab0b0455661186f37b303ed108ff26 gencode/java/udmi/schema/MappingEvents.java 2742b162c3524152f3f5fce62015139295fab7cbf8f58beb7f8287ea5d294e7c gencode/java/udmi/schema/MappingState.java 8b15a8982ccadc52d52a8083cb9e101c73f2a48e069c4d41d6e59ea914352507 gencode/java/udmi/schema/MessageTemplateData.java -a62d68e472aa154716452a14f2a9e87743002767dc45f76136f1c194e2a2187c gencode/java/udmi/schema/Metadata.java +da1d65d3e16c364a6bfefcd5e85551cd5801ec459ae8a16cd4123597b3f35998 gencode/java/udmi/schema/Metadata.java a64167bfcec809442cff132bb59ae0600055731407858656cc7147c3a38bb7cc gencode/java/udmi/schema/Metrics.java e986aff1efca08188441a246392f8c524c2cdaae107e475657402872a9a01561 gencode/java/udmi/schema/Monitoring.java 25210c7f94b6369c43c68ed1fefba1ab3dedfe3201352055c536fd5225a4c590 gencode/java/udmi/schema/MonitoringMetric.java @@ -194,7 +194,7 @@ dc4bef0026ac8d9b0e5b13fe675b16df889e38671a7946371fe47d0443d82e4d gencode/python 0423bfd2158a71a1ce3961054aceacbe6603ad1f65a707b586d17bfabb2a99cb gencode/python/udmi/schema/events_udmi.py 8f4ec5b4d717a0c497e914a2e15c72d96bfd3bbb119fa3b1e21ac96243c195bd gencode/python/udmi/schema/events_validation.py 3707a9a5a07b7cf80e4ce6b0ca81584de74a9d5fe361214a4d3b6f22dd30cad8 gencode/python/udmi/schema/events_validation_device.py -b6db8f2609fbcda488bb646b82e993557bfca6a5b2de5bd83640e48d105b7ad4 gencode/python/udmi/schema/metadata.py +f12e4299ed48d28de238dcae00d5d3866182b0d2d3cbb41e0917ea070211561d gencode/python/udmi/schema/metadata.py a947c8478dae5a245692d2d6de3044e9f7e57acad0b42fe774e9e5fb12fad335 gencode/python/udmi/schema/model_cloud.py 2ec91522178789a3d5ec27ad8ed13a94b8619139359dc3dcad9601b9adc1582d gencode/python/udmi/schema/model_cloud_config.py 387e3f68dad9ddd6211a4e10d25c35026a4c0083b606819fdb4e338be9e135ca gencode/python/udmi/schema/model_discovery.py diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index fd330a8c99..553735ebe5 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -3610,7 +3610,7 @@

+ aria-expanded="" aria-controls="relationships_pattern1" onclick="setAnchor('#relationships_pattern1')">^[A-Z]{2,6}-[1-9][0-9]*$ Pattern Property

@@ -3638,8 +3638,41 @@

d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8z" /> - Link Relationships Model

Link Relationships Model

Type: object
-

Information about how this device links relationships to other devices

+ ^[A-Z]{2,6}-[1-9][0-9]*$Type: array
+ + + + + + + No Additional Items

Each item of this array must be:

+
+
+ + +

Link Relationships Model

Type: object
+

Information about how this device relates to another device

No Additional Properties @@ -3649,18 +3682,18 @@

-
+
-
+

- +

-
+
Type: string
+ Link Relationships Model + + + + kind
Type: string

The kind of relationsihp between the two nodes

-
Must match regular expression: ^[a-z]+$ +Must match regular expression: ^[a-z]+$ @@ -3697,6 +3737,8 @@

+
+

diff --git a/gencode/java/udmi/schema/LinkRelationshipsModel.java b/gencode/java/udmi/schema/LinkRelationshipsModel.java index aac21b80e4..c36531df9e 100644 --- a/gencode/java/udmi/schema/LinkRelationshipsModel.java +++ b/gencode/java/udmi/schema/LinkRelationshipsModel.java @@ -10,7 +10,7 @@ /** * Link Relationships Model *

- * Information about how this device links relationships to other devices + * Information about how this device relates to another device * */ @JsonInclude(JsonInclude.Include.NON_NULL) @@ -21,6 +21,7 @@ public class LinkRelationshipsModel { /** * The kind of relationsihp between the two nodes + * (Required) * */ @JsonProperty("kind") diff --git a/gencode/java/udmi/schema/Metadata.java b/gencode/java/udmi/schema/Metadata.java index 68730d9d27..12aed7057b 100644 --- a/gencode/java/udmi/schema/Metadata.java +++ b/gencode/java/udmi/schema/Metadata.java @@ -3,6 +3,7 @@ import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; @@ -102,7 +103,7 @@ public class Metadata { */ @JsonProperty("relationships") @JsonPropertyDescription("Information for modeling noun-verb-noun relationships between devices") - public Map relationships; + public Map> relationships; /** * Externals Model *

diff --git a/gencode/python/udmi/schema/metadata.py b/gencode/python/udmi/schema/metadata.py index 95550e27fc..bdffd9729a 100644 --- a/gencode/python/udmi/schema/metadata.py +++ b/gencode/python/udmi/schema/metadata.py @@ -45,7 +45,7 @@ def from_dict(source): result.operation = source.get('operation') result.cloud = CloudModel.from_dict(source.get('cloud')) result.system = SystemModel.from_dict(source.get('system')) - result.relationships = LinkRelationshipsModel.map_from(source.get('relationships')) + result.relationships = source.get('relationships') result.externals = LinkExternalsModel.map_from(source.get('externals')) result.gateway = GatewayModel.from_dict(source.get('gateway')) result.discovery = DiscoveryModel.from_dict(source.get('discovery')) @@ -89,7 +89,7 @@ def to_dict(self): if self.system: result['system'] = self.system.to_dict() # 4 if self.relationships: - result['relationships'] = LinkRelationshipsModel.expand_dict(self.relationships) # 2 + result['relationships'] = self.relationships # 1 if self.externals: result['externals'] = LinkExternalsModel.expand_dict(self.externals) # 2 if self.gateway: diff --git a/schema/model_relationships.json b/schema/model_relationships.json index 23a967ca5f..fcd8d4eddf 100644 --- a/schema/model_relationships.json +++ b/schema/model_relationships.json @@ -5,10 +5,13 @@ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, - "existingJavaType": "java.util.Map", + "existingJavaType": "java.util.Map>", "patternProperties": { "^[A-Z]{2,6}-[1-9][0-9]*$": { - "$ref": "file:model_relationships_link.json" + "type": "array", + "items": { + "$ref": "file:model_relationships_link.json" + } } } } diff --git a/schema/model_relationships_link.json b/schema/model_relationships_link.json index dfbf1a04d3..26a65fde92 100644 --- a/schema/model_relationships_link.json +++ b/schema/model_relationships_link.json @@ -1,9 +1,9 @@ { "$udmi_version": "1.5.3", "title": "Link Relationships Model", - "description": "Information about how this device links relationships to other devices", - "type": "object", + "description": "Information about how this device relates to another device", "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", "additionalProperties": false, "properties": { "kind": { @@ -11,5 +11,8 @@ "pattern": "^[a-z]+$", "type": "string" } - } + }, + "required": [ + "kind" + ] } diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json index 0bee37b88a..a3307d6e30 100644 --- a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json +++ b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json @@ -18,7 +18,7 @@ "gateway": { "gateway_id": "GAT-123" }, - "hash": "bbaa3721", + "hash": "e35da407", "pointset": { "exclude_points_from_config": true, "points": { @@ -33,13 +33,17 @@ "sample_rate_sec": 30 }, "relationships": { - "AHU-1": { - "kind": "feeds" - }, - "AHU-22": {}, - "SNS-4": { - "kind": "contains" - } + "AHU-1": [ + { + "kind": "feeds" + } + ], + "AHU-22": [], + "SNS-4": [ + { + "kind": "contains" + } + ] }, "system": { "location": { diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index 24e119f169..2d148f935d 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -24,9 +24,9 @@ } }, "relationships": { - "AHU-1": { "kind": "feeds" }, - "AHU-22": {}, - "SNS-4": { "kind": "contains" } + "AHU-1": [{ "kind": "feeds" }], + "AHU-22": [], + "SNS-4": [{ "kind": "contains" }] }, "externals": { "dbo": { From 164dc22f4e87de020b90e9c2d664f80d870418e1 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 10:03:54 -0700 Subject: [PATCH 05/16] Fixing doc typo --- .gencode_hash.txt | 4 ++-- gencode/docs/metadata.html | 2 +- gencode/java/udmi/schema/LinkRelationshipsModel.java | 4 ++-- schema/model_relationships_link.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.gencode_hash.txt b/.gencode_hash.txt index a9284674f8..9fdf0154f0 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -13,7 +13,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -f545782cc954425cfe6d12171b8ee40fbfef76ac70a810c8f2cb6e7cfc3d5784 gencode/docs/metadata.html +3d2671f709201b5f817022951ae8a05f492cc90089ac7bd7596216c3a55ef9b4 gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -82,7 +82,7 @@ b63fed8a190948ee3924946c1ad3bc9cf06fdeafc7cea0886bfe52e390448ddf gencode/java/u d0858bd7ba306176f4e3c19eeb69ef2467afec0832b6917b72d3ab87469e4974 gencode/java/udmi/schema/Jwt.java 5a0cc53317592a868f7f23a67a7493bd571054bb25d9e28de51000ad6473dfeb gencode/java/udmi/schema/Level.java a6e7a378cb6b1223957cc268fa7259dc488de7cff91100f8920f6c2058d81f6b gencode/java/udmi/schema/LinkExternalsModel.java -552ef16a01f607e2a85db092656c8e7e8697c7c5a3fbe2d381925cf9463d65cf gencode/java/udmi/schema/LinkRelationshipsModel.java +8003ea8d9ca51f8f22f0e27263ef1bb299d61dfe939874e79f5327bff1bd9987 gencode/java/udmi/schema/LinkRelationshipsModel.java 6b4c29a682d0697d5420efb9e7788ec7358d94435da288938007205b8669e180 gencode/java/udmi/schema/LocalnetConfig.java 563bd616d4eb4201237ad356a144de80a4d0d1713701049009d0dbdab9fc37be gencode/java/udmi/schema/LocalnetModel.java b250808d1818cbe5366473cf814e9949c8c17dc4b5b2b281ba5845f3a696ba97 gencode/java/udmi/schema/LocalnetState.java diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index 553735ebe5..e8efb8895a 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -3725,7 +3725,7 @@

/> kindType: string
-

The kind of relationsihp between the two nodes

+

The kind of relationship between the two nodes

Must match regular expression: ^[a-z]+$ diff --git a/gencode/java/udmi/schema/LinkRelationshipsModel.java b/gencode/java/udmi/schema/LinkRelationshipsModel.java index c36531df9e..a8d5a034ad 100644 --- a/gencode/java/udmi/schema/LinkRelationshipsModel.java +++ b/gencode/java/udmi/schema/LinkRelationshipsModel.java @@ -20,12 +20,12 @@ public class LinkRelationshipsModel { /** - * The kind of relationsihp between the two nodes + * The kind of relationship between the two nodes * (Required) * */ @JsonProperty("kind") - @JsonPropertyDescription("The kind of relationsihp between the two nodes") + @JsonPropertyDescription("The kind of relationship between the two nodes") public String kind; @Override diff --git a/schema/model_relationships_link.json b/schema/model_relationships_link.json index 26a65fde92..82d2a96320 100644 --- a/schema/model_relationships_link.json +++ b/schema/model_relationships_link.json @@ -7,7 +7,7 @@ "additionalProperties": false, "properties": { "kind": { - "description": "The kind of relationsihp between the two nodes", + "description": "The kind of relationship between the two nodes", "pattern": "^[a-z]+$", "type": "string" } From e342705fcfe6d99fd216b7b9c434fdd3473f59f2 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 10:23:02 -0700 Subject: [PATCH 06/16] Increase some testing timeouts --- .github/workflows/testing.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index ca9b94d5eb..61e626a148 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -17,7 +17,7 @@ jobs: unit: name: Unit Tests runs-on: ubuntu-24.04 - timeout-minutes: 10 + timeout-minutes: 15 steps: - uses: actions/setup-java@v4 with: @@ -118,7 +118,7 @@ jobs: baseline: name: Baseline Tests runs-on: ubuntu-24.04 - timeout-minutes: 15 + timeout-minutes: 20 needs: automapping if: vars.TARGET_PROJECT != '' env: @@ -167,7 +167,7 @@ jobs: sequencer: name: Sequencer Tests runs-on: ubuntu-24.04 - timeout-minutes: 25 + timeout-minutes: 30 strategy: fail-fast: false matrix: From 508b35c2c78eecc2760b9db1e5811bf3e2b37c8a Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 2 Oct 2025 11:23:18 -0700 Subject: [PATCH 07/16] Fixing error out --- tests/sites/downgrade/devices/DWN-2/expected/errors.map | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sites/downgrade/devices/DWN-2/expected/errors.map b/tests/sites/downgrade/devices/DWN-2/expected/errors.map index 2e859cb2be..1e7eb5cc6b 100644 --- a/tests/sites/downgrade/devices/DWN-2/expected/errors.map +++ b/tests/sites/downgrade/devices/DWN-2/expected/errors.map @@ -2,4 +2,4 @@ Exceptions for DWN-2 While loading device metadata for DWN-2 While converting strict to udmi.schema.Metadata While converting string/string to udmi.schema.Metadata - Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "external", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) + Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (16 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "relationships", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) From 3b244cc0859e0f387d7a7b10a25b99c2b03e5323 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Sun, 5 Oct 2025 06:42:28 -0700 Subject: [PATCH 08/16] Making relationsihps only --- .gencode_hash.txt | 11 +- gencode/docs/metadata.html | 624 +++++------------- .../java/udmi/schema/LinkExternalsModel.java | 76 --- gencode/java/udmi/schema/Metadata.java | 33 +- gencode/python/udmi/schema/__init__.py | 2 - gencode/python/udmi/schema/metadata.py | 15 +- gencode/python/udmi/schema/model_externals.py | 35 - .../udmi/schema/model_externals_link.py | 50 -- schema/metadata.json | 9 +- schema/model_externals.json | 14 - schema/model_externals_link.json | 27 - tests/sites/basic/devices/SNS-4/metadata.json | 16 - 12 files changed, 197 insertions(+), 715 deletions(-) delete mode 100644 gencode/java/udmi/schema/LinkExternalsModel.java delete mode 100644 gencode/python/udmi/schema/model_externals.py delete mode 100644 gencode/python/udmi/schema/model_externals_link.py delete mode 100644 schema/model_externals.json delete mode 100644 schema/model_externals_link.json diff --git a/.gencode_hash.txt b/.gencode_hash.txt index 9fdf0154f0..3cd0e89a13 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -13,7 +13,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -3d2671f709201b5f817022951ae8a05f492cc90089ac7bd7596216c3a55ef9b4 gencode/docs/metadata.html +a7ffafa8918939f676ba06cc215a0588602923f3445cb360a2697c0c87545f7c gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -81,7 +81,6 @@ b63fed8a190948ee3924946c1ad3bc9cf06fdeafc7cea0886bfe52e390448ddf gencode/java/u 175bdf9cc0b376b7f6c6b21174cb0ec568c49a1026e99bbdbc264b3cea7e7702 gencode/java/udmi/schema/IotAccess.java d0858bd7ba306176f4e3c19eeb69ef2467afec0832b6917b72d3ab87469e4974 gencode/java/udmi/schema/Jwt.java 5a0cc53317592a868f7f23a67a7493bd571054bb25d9e28de51000ad6473dfeb gencode/java/udmi/schema/Level.java -a6e7a378cb6b1223957cc268fa7259dc488de7cff91100f8920f6c2058d81f6b gencode/java/udmi/schema/LinkExternalsModel.java 8003ea8d9ca51f8f22f0e27263ef1bb299d61dfe939874e79f5327bff1bd9987 gencode/java/udmi/schema/LinkRelationshipsModel.java 6b4c29a682d0697d5420efb9e7788ec7358d94435da288938007205b8669e180 gencode/java/udmi/schema/LocalnetConfig.java 563bd616d4eb4201237ad356a144de80a4d0d1713701049009d0dbdab9fc37be gencode/java/udmi/schema/LocalnetModel.java @@ -93,7 +92,7 @@ ca932e3a0d0da213950aa89ad7a19d94505dd478bf196946aa93436c5c8b7512 gencode/java/u edbb091621a6f5e3f7e6804c7c30c0877fab0b0455661186f37b303ed108ff26 gencode/java/udmi/schema/MappingEvents.java 2742b162c3524152f3f5fce62015139295fab7cbf8f58beb7f8287ea5d294e7c gencode/java/udmi/schema/MappingState.java 8b15a8982ccadc52d52a8083cb9e101c73f2a48e069c4d41d6e59ea914352507 gencode/java/udmi/schema/MessageTemplateData.java -da1d65d3e16c364a6bfefcd5e85551cd5801ec459ae8a16cd4123597b3f35998 gencode/java/udmi/schema/Metadata.java +17646d0b225946d5ec44c56e123450969d0abf627a3f534476a354eb09a95158 gencode/java/udmi/schema/Metadata.java a64167bfcec809442cff132bb59ae0600055731407858656cc7147c3a38bb7cc gencode/java/udmi/schema/Metrics.java e986aff1efca08188441a246392f8c524c2cdaae107e475657402872a9a01561 gencode/java/udmi/schema/Monitoring.java 25210c7f94b6369c43c68ed1fefba1ab3dedfe3201352055c536fd5225a4c590 gencode/java/udmi/schema/MonitoringMetric.java @@ -146,7 +145,7 @@ eadc72e31b4796273479967303513b16563af0f946d1e1c7eba1748f9b133d40 gencode/java/u 5596535c39826e904949eed7894c3ecd1ee982d974beb7469f888965af2c7845 gencode/java/udmi/schema/VirtualEquipmentLinks.java 11f8dab5296d41e86cd623a4ed27b972ae673b141907cb913397d4eb53880c59 gencode/java/udmi/schema/Water.java d2a53a067185447ce672e5521cdb073a2b2100b9384b68e87211cafc5ef8cb2a gencode/presentation/presentation.json -7ed3bec898da16f6b697aa0e688da47083d6fec0ef51b90b65f8c7943b78197a gencode/python/udmi/schema/__init__.py +60c02afe7f4f4191c55c4bb5ff9a41a0f96c3aebfe1d208d8b2f463d8cae4da6 gencode/python/udmi/schema/__init__.py 25ae570fe5a988fd98a112fde81ceea440efb16b93dee58619fa532d98270879 gencode/python/udmi/schema/access_iot.py 4b25dd95f863059b761269f93adcae7049507924a1c6e74d6856849203c179db gencode/python/udmi/schema/ancillary_properties.py dab4f5fca272ec48c2881bca2b6bc43786ada47fa1f6dd935c35f7ce0eb6b0f6 gencode/python/udmi/schema/building_translation.py @@ -194,13 +193,11 @@ dc4bef0026ac8d9b0e5b13fe675b16df889e38671a7946371fe47d0443d82e4d gencode/python 0423bfd2158a71a1ce3961054aceacbe6603ad1f65a707b586d17bfabb2a99cb gencode/python/udmi/schema/events_udmi.py 8f4ec5b4d717a0c497e914a2e15c72d96bfd3bbb119fa3b1e21ac96243c195bd gencode/python/udmi/schema/events_validation.py 3707a9a5a07b7cf80e4ce6b0ca81584de74a9d5fe361214a4d3b6f22dd30cad8 gencode/python/udmi/schema/events_validation_device.py -f12e4299ed48d28de238dcae00d5d3866182b0d2d3cbb41e0917ea070211561d gencode/python/udmi/schema/metadata.py +53c60da4f61662b8ba14ce1ad6271af6cfff042dcf7c12d5e04e3074d1921164 gencode/python/udmi/schema/metadata.py a947c8478dae5a245692d2d6de3044e9f7e57acad0b42fe774e9e5fb12fad335 gencode/python/udmi/schema/model_cloud.py 2ec91522178789a3d5ec27ad8ed13a94b8619139359dc3dcad9601b9adc1582d gencode/python/udmi/schema/model_cloud_config.py 387e3f68dad9ddd6211a4e10d25c35026a4c0083b606819fdb4e338be9e135ca gencode/python/udmi/schema/model_discovery.py ab4377d772bf11fa064ce74504af753a4cfac507a7c8f807b682f972353dbc5c gencode/python/udmi/schema/model_discovery_family.py -b93bc3d362dc995c63476dae1d6b1b818b84ebc5a220883c9fec356e183c9d9d gencode/python/udmi/schema/model_externals.py -1c5fac6ae9f0242e766c004df54bca8e50d433c312b37d45bbda30629745204e gencode/python/udmi/schema/model_externals_link.py bef91798566798ec70b2fe10ae52c909090de9095b92e2567da3cbdcec29cd2c gencode/python/udmi/schema/model_features.py 72d17ba53c9d537720bb0ddf24d615b838fc2b9bb2a5c288742a8d82c77bd85d gencode/python/udmi/schema/model_gateway.py 327ce1ecb1f3afbf4118c34ee5c68c8b7255a6e371711d3974c6155af82c0a43 gencode/python/udmi/schema/model_localnet.py diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index e8efb8895a..5799bedfb8 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -3573,456 +3573,6 @@

-
-
-
-

- -

-
- -
-
- -

Relationships Model

Type: object
-

Information for modeling noun-verb-noun relationships between devices

-
- - No Additional Properties - - - - - - -
-
-
-

- -

-
- -
-

- -

-

All properties whose name matches the following regular expression must respect the following conditions

- Property name regular expression: ^[A-Z]{2,6}-[1-9][0-9]*$ -
- - Type: array
- - - - - - - No Additional Items

Each item of this array must be:

-
-
- - -

Link Relationships Model

Type: object
-

Information about how this device relates to another device

-
- - No Additional Properties - - - - - - -
-
-
-

- -

-
- -
-
- - Type: string
-

The kind of relationship between the two nodes

-
Must match regular expression: ^[a-z]+$ - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

- -

-
- -
-
- -

Externals Model

Type: object
-

Information specific to how the device links with external models

-
- - No Additional Properties - - - - - - -
-
-
-

- -

-
- -
-

- -

-

All properties whose name matches the following regular expression must respect the following conditions

- Property name regular expression: ^[a-z]+(_[a-z]+)*$ -
- -

Link Externals Model

Type: object
-

Information about how this device links to a specific external model

-
- - No Additional Properties - - - - - - -
-
-
-

- -

-
- -
-
- - Type: string
-

Id of this device in the external model namespace

-
- - - - - - -
-
-
-
-
-
-
-

- -

-
- -
-
- - Type: string
-

Type of this device in the external model namespace

-
- - - - - - -
-
-
-
-
-
-
-

- -

-
- -
-
- - Type: string
-

Etag for referencing this external entity

-
Must match regular expression: ^[0-9a-f]+$ - - - - - - -
-
-
-
-
-
-
-

- -

-
- -
-
- - Type: string
-

Description of this device in the external model namespace

-
- - - - - - -
-
-
-
-
-
-
-
-
-
-
-
@@ -4892,6 +4442,180 @@

+
+
+
+

+ +

+
+ +
+
+ +

Relationships Model

Type: object
+

Information for modeling noun-verb-noun relationships between devices

+
+ + No Additional Properties + + + + + + +
+
+
+

+ +

+
+ +
+

+ +

+

All properties whose name matches the following regular expression must respect the following conditions

+ Property name regular expression: ^[A-Z]{2,6}-[1-9][0-9]*$ +
+ + Type: array
+ + + + + + + No Additional Items

Each item of this array must be:

+
+
+ + +

Link Relationships Model

Type: object
+

Information about how this device relates to another device

+
+ + No Additional Properties + + + + + + +
+
+
+

+ +

+
+ +
+
+ + Type: string
+

The kind of relationship between the two nodes

+
Must match regular expression: ^[a-z]+$ + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gencode/java/udmi/schema/LinkExternalsModel.java b/gencode/java/udmi/schema/LinkExternalsModel.java deleted file mode 100644 index 15ad9fd8e6..0000000000 --- a/gencode/java/udmi/schema/LinkExternalsModel.java +++ /dev/null @@ -1,76 +0,0 @@ - -package udmi.schema; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - - -/** - * Link Externals Model - *

- * Information about how this device links to a specific external model - * - */ -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({ - "entity_id", - "entity_type", - "etag", - "description" -}) -public class LinkExternalsModel { - - /** - * Id of this device in the external model namespace - * - */ - @JsonProperty("entity_id") - @JsonPropertyDescription("Id of this device in the external model namespace") - public String entity_id; - /** - * Type of this device in the external model namespace - * - */ - @JsonProperty("entity_type") - @JsonPropertyDescription("Type of this device in the external model namespace") - public String entity_type; - /** - * Etag for referencing this external entity - * - */ - @JsonProperty("etag") - @JsonPropertyDescription("Etag for referencing this external entity") - public String etag; - /** - * Description of this device in the external model namespace - * - */ - @JsonProperty("description") - @JsonPropertyDescription("Description of this device in the external model namespace") - public String description; - - @Override - public int hashCode() { - int result = 1; - result = ((result* 31)+((this.description == null)? 0 :this.description.hashCode())); - result = ((result* 31)+((this.etag == null)? 0 :this.etag.hashCode())); - result = ((result* 31)+((this.entity_type == null)? 0 :this.entity_type.hashCode())); - result = ((result* 31)+((this.entity_id == null)? 0 :this.entity_id.hashCode())); - return result; - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if ((other instanceof LinkExternalsModel) == false) { - return false; - } - LinkExternalsModel rhs = ((LinkExternalsModel) other); - return (((((this.description == rhs.description)||((this.description!= null)&&this.description.equals(rhs.description)))&&((this.etag == rhs.etag)||((this.etag!= null)&&this.etag.equals(rhs.etag))))&&((this.entity_type == rhs.entity_type)||((this.entity_type!= null)&&this.entity_type.equals(rhs.entity_type))))&&((this.entity_id == rhs.entity_id)||((this.entity_id!= null)&&this.entity_id.equals(rhs.entity_id)))); - } - -} diff --git a/gencode/java/udmi/schema/Metadata.java b/gencode/java/udmi/schema/Metadata.java index 12aed7057b..7bcd42f571 100644 --- a/gencode/java/udmi/schema/Metadata.java +++ b/gencode/java/udmi/schema/Metadata.java @@ -26,10 +26,9 @@ "operation", "cloud", "system", - "relationships", - "externals", "gateway", "discovery", + "relationships", "localnet", "testing", "features", @@ -95,24 +94,6 @@ public class Metadata { @JsonProperty("system") @JsonPropertyDescription("High-level system information about the device. [System Model Documentation](../docs/messages/system.md)") public SystemModel system; - /** - * Relationships Model - *

- * Information for modeling noun-verb-noun relationships between devices - * - */ - @JsonProperty("relationships") - @JsonPropertyDescription("Information for modeling noun-verb-noun relationships between devices") - public Map> relationships; - /** - * Externals Model - *

- * Information specific to how the device links with external models - * - */ - @JsonProperty("externals") - @JsonPropertyDescription("Information specific to how the device links with external models") - public Map externals; /** * Gateway Model *

@@ -131,6 +112,15 @@ public class Metadata { @JsonProperty("discovery") @JsonPropertyDescription("Discovery target parameters") public DiscoveryModel discovery; + /** + * Relationships Model + *

+ * Information for modeling noun-verb-noun relationships between devices + * + */ + @JsonProperty("relationships") + @JsonPropertyDescription("Information for modeling noun-verb-noun relationships between devices") + public Map> relationships; /** * Localnet Model *

@@ -183,7 +173,6 @@ public int hashCode() { result = ((result* 31)+((this.discovery == null)? 0 :this.discovery.hashCode())); result = ((result* 31)+((this.upgraded_from == null)? 0 :this.upgraded_from.hashCode())); result = ((result* 31)+((this.pointset == null)? 0 :this.pointset.hashCode())); - result = ((result* 31)+((this.externals == null)? 0 :this.externals.hashCode())); result = ((result* 31)+((this.operation == null)? 0 :this.operation.hashCode())); result = ((result* 31)+((this.hash == null)? 0 :this.hash.hashCode())); result = ((result* 31)+((this.gateway == null)? 0 :this.gateway.hashCode())); @@ -201,7 +190,7 @@ public boolean equals(Object other) { return false; } Metadata rhs = ((Metadata) other); - return (((((((((((((((((this.testing == rhs.testing)||((this.testing!= null)&&this.testing.equals(rhs.testing)))&&((this.version == rhs.version)||((this.version!= null)&&this.version.equals(rhs.version))))&&((this.structure == rhs.structure)||((this.structure!= null)&&this.structure.equals(rhs.structure))))&&((this.cloud == rhs.cloud)||((this.cloud!= null)&&this.cloud.equals(rhs.cloud))))&&((this.relationships == rhs.relationships)||((this.relationships!= null)&&this.relationships.equals(rhs.relationships))))&&((this.features == rhs.features)||((this.features!= null)&&this.features.equals(rhs.features))))&&((this.system == rhs.system)||((this.system!= null)&&this.system.equals(rhs.system))))&&((this.discovery == rhs.discovery)||((this.discovery!= null)&&this.discovery.equals(rhs.discovery))))&&((this.upgraded_from == rhs.upgraded_from)||((this.upgraded_from!= null)&&this.upgraded_from.equals(rhs.upgraded_from))))&&((this.pointset == rhs.pointset)||((this.pointset!= null)&&this.pointset.equals(rhs.pointset))))&&((this.externals == rhs.externals)||((this.externals!= null)&&this.externals.equals(rhs.externals))))&&((this.operation == rhs.operation)||((this.operation!= null)&&this.operation.equals(rhs.operation))))&&((this.hash == rhs.hash)||((this.hash!= null)&&this.hash.equals(rhs.hash))))&&((this.gateway == rhs.gateway)||((this.gateway!= null)&&this.gateway.equals(rhs.gateway))))&&((this.localnet == rhs.localnet)||((this.localnet!= null)&&this.localnet.equals(rhs.localnet))))&&((this.timestamp == rhs.timestamp)||((this.timestamp!= null)&&this.timestamp.equals(rhs.timestamp)))); + return ((((((((((((((((this.testing == rhs.testing)||((this.testing!= null)&&this.testing.equals(rhs.testing)))&&((this.version == rhs.version)||((this.version!= null)&&this.version.equals(rhs.version))))&&((this.structure == rhs.structure)||((this.structure!= null)&&this.structure.equals(rhs.structure))))&&((this.cloud == rhs.cloud)||((this.cloud!= null)&&this.cloud.equals(rhs.cloud))))&&((this.relationships == rhs.relationships)||((this.relationships!= null)&&this.relationships.equals(rhs.relationships))))&&((this.features == rhs.features)||((this.features!= null)&&this.features.equals(rhs.features))))&&((this.system == rhs.system)||((this.system!= null)&&this.system.equals(rhs.system))))&&((this.discovery == rhs.discovery)||((this.discovery!= null)&&this.discovery.equals(rhs.discovery))))&&((this.upgraded_from == rhs.upgraded_from)||((this.upgraded_from!= null)&&this.upgraded_from.equals(rhs.upgraded_from))))&&((this.pointset == rhs.pointset)||((this.pointset!= null)&&this.pointset.equals(rhs.pointset))))&&((this.operation == rhs.operation)||((this.operation!= null)&&this.operation.equals(rhs.operation))))&&((this.hash == rhs.hash)||((this.hash!= null)&&this.hash.equals(rhs.hash))))&&((this.gateway == rhs.gateway)||((this.gateway!= null)&&this.gateway.equals(rhs.gateway))))&&((this.localnet == rhs.localnet)||((this.localnet!= null)&&this.localnet.equals(rhs.localnet))))&&((this.timestamp == rhs.timestamp)||((this.timestamp!= null)&&this.timestamp.equals(rhs.timestamp)))); } } diff --git a/gencode/python/udmi/schema/__init__.py b/gencode/python/udmi/schema/__init__.py index 1763771672..6f5d5b37cc 100644 --- a/gencode/python/udmi/schema/__init__.py +++ b/gencode/python/udmi/schema/__init__.py @@ -50,8 +50,6 @@ from .model_cloud_config import CloudConfigModel from .model_discovery import DiscoveryModel from .model_discovery_family import FamilyDiscoveryModel -from .model_externals import ExternalsModel -from .model_externals_link import LinkExternalsModel from .model_features import TestingModel from .model_gateway import GatewayModel from .model_localnet import LocalnetModel diff --git a/gencode/python/udmi/schema/metadata.py b/gencode/python/udmi/schema/metadata.py index bdffd9729a..6a310ebf12 100644 --- a/gencode/python/udmi/schema/metadata.py +++ b/gencode/python/udmi/schema/metadata.py @@ -1,10 +1,9 @@ """Generated class for metadata.json""" from .model_cloud import CloudModel from .model_system import SystemModel -from .model_relationships import RelationshipsModel -from .model_externals import ExternalsModel from .model_gateway import GatewayModel from .model_discovery import DiscoveryModel +from .model_relationships import RelationshipsModel from .model_localnet import LocalnetModel from .model_testing import TestingModel from .model_features import TestingModel @@ -23,10 +22,9 @@ def __init__(self): self.operation = None self.cloud = None self.system = None - self.relationships = None - self.externals = None self.gateway = None self.discovery = None + self.relationships = None self.localnet = None self.testing = None self.features = None @@ -45,10 +43,9 @@ def from_dict(source): result.operation = source.get('operation') result.cloud = CloudModel.from_dict(source.get('cloud')) result.system = SystemModel.from_dict(source.get('system')) - result.relationships = source.get('relationships') - result.externals = LinkExternalsModel.map_from(source.get('externals')) result.gateway = GatewayModel.from_dict(source.get('gateway')) result.discovery = DiscoveryModel.from_dict(source.get('discovery')) + result.relationships = source.get('relationships') result.localnet = LocalnetModel.from_dict(source.get('localnet')) result.testing = TestingModel.from_dict(source.get('testing')) result.features = FeatureDiscovery.map_from(source.get('features')) @@ -88,14 +85,12 @@ def to_dict(self): result['cloud'] = self.cloud.to_dict() # 4 if self.system: result['system'] = self.system.to_dict() # 4 - if self.relationships: - result['relationships'] = self.relationships # 1 - if self.externals: - result['externals'] = LinkExternalsModel.expand_dict(self.externals) # 2 if self.gateway: result['gateway'] = self.gateway.to_dict() # 4 if self.discovery: result['discovery'] = self.discovery.to_dict() # 4 + if self.relationships: + result['relationships'] = self.relationships # 1 if self.localnet: result['localnet'] = self.localnet.to_dict() # 4 if self.testing: diff --git a/gencode/python/udmi/schema/model_externals.py b/gencode/python/udmi/schema/model_externals.py deleted file mode 100644 index c5cbee13c2..0000000000 --- a/gencode/python/udmi/schema/model_externals.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Generated class for model_externals.json""" - - -class ExternalsModel: - """Generated schema class""" - - def __init__(self): - pass - - @staticmethod - def from_dict(source): - if not source: - return None - result = ExternalsModel() - return result - - @staticmethod - def map_from(source): - if not source: - return None - result = {} - for key in source: - result[key] = ExternalsModel.from_dict(source[key]) - return result - - @staticmethod - def expand_dict(input): - result = {} - for property in input: - result[property] = input[property].to_dict() if input[property] else {} - return result - - def to_dict(self): - result = {} - return result diff --git a/gencode/python/udmi/schema/model_externals_link.py b/gencode/python/udmi/schema/model_externals_link.py deleted file mode 100644 index a7d30348c0..0000000000 --- a/gencode/python/udmi/schema/model_externals_link.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Generated class for model_externals_link.json""" - - -class LinkExternalsModel: - """Generated schema class""" - - def __init__(self): - self.entity_id = None - self.entity_type = None - self.etag = None - self.description = None - - @staticmethod - def from_dict(source): - if not source: - return None - result = LinkExternalsModel() - result.entity_id = source.get('entity_id') - result.entity_type = source.get('entity_type') - result.etag = source.get('etag') - result.description = source.get('description') - return result - - @staticmethod - def map_from(source): - if not source: - return None - result = {} - for key in source: - result[key] = LinkExternalsModel.from_dict(source[key]) - return result - - @staticmethod - def expand_dict(input): - result = {} - for property in input: - result[property] = input[property].to_dict() if input[property] else {} - return result - - def to_dict(self): - result = {} - if self.entity_id: - result['entity_id'] = self.entity_id # 5 - if self.entity_type: - result['entity_type'] = self.entity_type # 5 - if self.etag: - result['etag'] = self.etag # 5 - if self.description: - result['description'] = self.description # 5 - return result diff --git a/schema/metadata.json b/schema/metadata.json index 8bdd6a79be..eabc21ab74 100644 --- a/schema/metadata.json +++ b/schema/metadata.json @@ -47,12 +47,6 @@ "section": "system" } }, - "relationships": { - "$ref": "file:model_relationships.json#" - }, - "externals": { - "$ref": "file:model_externals.json#" - }, "gateway": { "$ref": "file:model_gateway.json#", "$presentation": { @@ -62,6 +56,9 @@ "discovery": { "$ref": "file:model_discovery.json#" }, + "relationships": { + "$ref": "file:model_relationships.json#" + }, "localnet": { "$ref": "file:model_localnet.json#", "$presentation": { diff --git a/schema/model_externals.json b/schema/model_externals.json deleted file mode 100644 index 91fdbca0a2..0000000000 --- a/schema/model_externals.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$udmi_version": "1.5.3", - "title": "Externals Model", - "description": "Information specific to how the device links with external models", - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "existingJavaType": "java.util.Map", - "patternProperties": { - "^[a-z]+(_[a-z]+)*$": { - "$ref": "file:model_externals_link.json" - } - } -} diff --git a/schema/model_externals_link.json b/schema/model_externals_link.json deleted file mode 100644 index 478b3b6aac..0000000000 --- a/schema/model_externals_link.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$udmi_version": "1.5.3", - "title": "Link Externals Model", - "description": "Information about how this device links to a specific external model", - "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "entity_id": { - "description": "Id of this device in the external model namespace", - "type": "string" - }, - "entity_type": { - "description": "Type of this device in the external model namespace", - "type": "string" - }, - "etag": { - "description": "Etag for referencing this external entity", - "pattern": "^[0-9a-f]+$", - "type": "string" - }, - "description": { - "description": "Description of this device in the external model namespace", - "type": "string" - } - } -} diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index 2d148f935d..520fdd6b6a 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -28,22 +28,6 @@ "AHU-22": [], "SNS-4": [{ "kind": "contains" }] }, - "externals": { - "dbo": { - "entity_id": "0060917f-8c21-47c4-b011-52521085fdc3", - "entity_type": "HVAC/VAV_SD_DSP", - "description": "VAV CO 1-2-37" - }, - "ifc": { - "entity_id": "a87a9b4b-e9e5-424b-9a4e-22378987dddd", - "etag": "98bac980", - "entity_type": "IfcDoor" - }, - "json_ld": { - "entity_id": "https://dbpedia.org/page/John_Lennon", - "entity_type": "person" - } - }, "gateway": { "gateway_id": "GAT-123" }, From 5f44abf9f8676135b701285825210edc461a4e62 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Sun, 5 Oct 2025 08:08:57 -0700 Subject: [PATCH 09/16] Cleaning up ref --- .github/workflows/testing.yml | 6 +++--- bin/test_mosquitto | 17 +---------------- tests/sites/basic/devices/SNS-4/metadata.json | 1 - 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 61e626a148..ca9b94d5eb 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -17,7 +17,7 @@ jobs: unit: name: Unit Tests runs-on: ubuntu-24.04 - timeout-minutes: 15 + timeout-minutes: 10 steps: - uses: actions/setup-java@v4 with: @@ -118,7 +118,7 @@ jobs: baseline: name: Baseline Tests runs-on: ubuntu-24.04 - timeout-minutes: 20 + timeout-minutes: 15 needs: automapping if: vars.TARGET_PROJECT != '' env: @@ -167,7 +167,7 @@ jobs: sequencer: name: Sequencer Tests runs-on: ubuntu-24.04 - timeout-minutes: 30 + timeout-minutes: 25 strategy: fail-fast: false matrix: diff --git a/bin/test_mosquitto b/bin/test_mosquitto index 6944bdc31d..642f337ebe 100755 --- a/bin/test_mosquitto +++ b/bin/test_mosquitto @@ -1,4 +1,4 @@ -#!/bin/bash -eux +#!/bin/bash -eu UDMI_ROOT=$(dirname $0)/.. cd $UDMI_ROOT @@ -116,23 +116,8 @@ echo Checking received end message fgrep Rudolph out/mosquitto.sub || fail did not find expected message echo Checking messages for matching serial no $serial_no -fgrep operational out/mosquitto.sub | wc -l -fgrep operational out/mosquitto.sub | head -n 1 -echo mark A && sleep 1 -fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' -echo mark B && sleep 1 -fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' > foo.json -echo mark C && sleep 1 -jq -r .system.serial_no foo.json || true -echo mark D && sleep 1 -fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' | jq -r .system.serial_no -echo mark E && sleep 1 received_no=$(fgrep operational out/mosquitto.sub | head -n 1 | sed -E 's/^[^{]+//' | jq -r .system.serial_no) -echo mark F && sleep 1 -echo received_no $received_no -echo mark G && sleep 1 received_topic=$(fgrep operational out/mosquitto.sub | head -n 1 | awk '{ print $1 }') -echo received_topic $received_topic [[ -z $received_topic ]] && fail No matching receive message found. expected_topic=/r/$registry_id/d/$device_id/state diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index 520fdd6b6a..918782c6a4 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -6,7 +6,6 @@ "units": "Degrees-phase" }, "split_threshold": { - "ref": "iot://SNS-22/split_threshold", "units": "Imperial-gallons-per-minute" } } From 80829430fd11e3ebcb884887650e80f708944455 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Sun, 5 Oct 2025 08:21:48 -0700 Subject: [PATCH 10/16] Cleaning up output --- .../GAT-123/expected/generated_config.json | 1 - .../GAT-123/expected/metadata_norm.json | 3 +- .../basic/devices/GAT-72/expected/errors.map | 3 +- .../basic/devices/SNS-4/expected/errors.map | 5 +- .../SNS-4/expected/generated_config.json | 13 ---- .../devices/SNS-4/expected/metadata_norm.json | 64 ------------------- .../devices/DWN-2/expected/errors.map | 2 +- 7 files changed, 7 insertions(+), 84 deletions(-) delete mode 100644 tests/sites/basic/devices/SNS-4/expected/generated_config.json delete mode 100644 tests/sites/basic/devices/SNS-4/expected/metadata_norm.json diff --git a/tests/sites/basic/devices/GAT-123/expected/generated_config.json b/tests/sites/basic/devices/GAT-123/expected/generated_config.json index c208443dfd..54762baf79 100644 --- a/tests/sites/basic/devices/GAT-123/expected/generated_config.json +++ b/tests/sites/basic/devices/GAT-123/expected/generated_config.json @@ -2,7 +2,6 @@ "gateway": { "proxy_ids": [ "AHU-22", - "SNS-4", "SNS-8" ] }, diff --git a/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json b/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json index 0d2e31760a..91685b6e07 100644 --- a/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json +++ b/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json @@ -6,11 +6,10 @@ "gateway": { "proxy_ids": [ "AHU-22", - "SNS-4", "SNS-8" ] }, - "hash": "6bdf3f23", + "hash": "51f5948a", "localnet": { "families": { "vendor": { diff --git a/tests/sites/basic/devices/GAT-72/expected/errors.map b/tests/sites/basic/devices/GAT-72/expected/errors.map index e91c030d5d..02a0b3b883 100644 --- a/tests/sites/basic/devices/GAT-72/expected/errors.map +++ b/tests/sites/basic/devices/GAT-72/expected/errors.map @@ -1,7 +1,6 @@ Exceptions for GAT-72 - List of 3 exceptions + List of 2 exceptions GAT-72 proxy_id mismatch: [AHU-1, SNS-4] Should not proxy direct device AHU-1 - gateway_id mismatch for SNS-4: GAT-123 != GAT-72 While converting device config generation specified without scan_interval_sec parameter diff --git a/tests/sites/basic/devices/SNS-4/expected/errors.map b/tests/sites/basic/devices/SNS-4/expected/errors.map index dac70773a2..a932e5a448 100644 --- a/tests/sites/basic/devices/SNS-4/expected/errors.map +++ b/tests/sites/basic/devices/SNS-4/expected/errors.map @@ -1,2 +1,5 @@ Exceptions for SNS-4 - gateway_id mismatch for SNS-4: GAT-123 != GAT-72 + While loading device metadata for SNS-4 + While converting strict to udmi.schema.Metadata + While converting string/string to udmi.schema.Metadata + Unrecognized field "relationships" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "gateway" : { "gateway_id" : "GAT-123" }, "pointset" : { "exclude_points_from_config" : true, "points" : { "split_threshold" : { "units" : "Imperial-gallons-per-minute" }, "triangulating_axis" : { "units" : "Degrees-phase" } }, "sample_rate_sec" : 30 }, "relationships" : { "AHU-1" : [ { "kind" : "feeds" } ], "AHU-22" : [ ], "SNS-4" : [ { "kind" : "contains" } ] }, "system" : { "locatio"[truncated 283 chars]; line: 17, column: 22] (through reference chain: udmi.schema.Metadata["relationships"]) diff --git a/tests/sites/basic/devices/SNS-4/expected/generated_config.json b/tests/sites/basic/devices/SNS-4/expected/generated_config.json deleted file mode 100644 index 04aa4c13d0..0000000000 --- a/tests/sites/basic/devices/SNS-4/expected/generated_config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "gateway": {}, - "pointset": { - "sample_rate_sec": 30 - }, - "system": { - "metrics_rate_sec": 10, - "min_loglevel": 300, - "operation": {} - }, - "timestamp": "2020-05-01T13:39:07Z", - "version": "1.5.3" -} diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json deleted file mode 100644 index a3307d6e30..0000000000 --- a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "externals": { - "dbo": { - "description": "VAV CO 1-2-37", - "entity_id": "0060917f-8c21-47c4-b011-52521085fdc3", - "entity_type": "HVAC/VAV_SD_DSP" - }, - "ifc": { - "entity_id": "a87a9b4b-e9e5-424b-9a4e-22378987dddd", - "entity_type": "IfcDoor", - "etag": "98bac980" - }, - "json_ld": { - "entity_id": "https://dbpedia.org/page/John_Lennon", - "entity_type": "person" - } - }, - "gateway": { - "gateway_id": "GAT-123" - }, - "hash": "e35da407", - "pointset": { - "exclude_points_from_config": true, - "points": { - "split_threshold": { - "ref": "iot://SNS-22/split_threshold", - "units": "Imperial-gallons-per-minute" - }, - "triangulating_axis": { - "units": "Degrees-phase" - } - }, - "sample_rate_sec": 30 - }, - "relationships": { - "AHU-1": [ - { - "kind": "feeds" - } - ], - "AHU-22": [], - "SNS-4": [ - { - "kind": "contains" - } - ] - }, - "system": { - "location": { - "section": "2-3N8C", - "site": "ZZ-TRI-FECTA" - }, - "min_loglevel": 300, - "physical_tag": { - "asset": { - "guid": "drw://TBA", - "name": "SNS-4", - "site": "ZZ-TRI-FECTA" - } - } - }, - "timestamp": "2020-05-01T13:39:07Z", - "version": "1.5.2" -} diff --git a/tests/sites/downgrade/devices/DWN-2/expected/errors.map b/tests/sites/downgrade/devices/DWN-2/expected/errors.map index 1e7eb5cc6b..92cadf5eb3 100644 --- a/tests/sites/downgrade/devices/DWN-2/expected/errors.map +++ b/tests/sites/downgrade/devices/DWN-2/expected/errors.map @@ -2,4 +2,4 @@ Exceptions for DWN-2 While loading device metadata for DWN-2 While converting strict to udmi.schema.Metadata While converting string/string to udmi.schema.Metadata - Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (16 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "relationships", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) + Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) From a8961c74e338465065c6a791f3cdec5e674a3ba9 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Sun, 5 Oct 2025 08:36:04 -0700 Subject: [PATCH 11/16] Cleaning up output --- .../basic/devices/GAT-123/expected/generated_config.json | 1 + .../sites/basic/devices/GAT-123/expected/metadata_norm.json | 3 ++- tests/sites/basic/devices/GAT-72/expected/errors.map | 3 ++- tests/sites/basic/devices/SNS-4/expected/errors.map | 5 +---- .../sites/basic/devices/SNS-4/expected/generated_config.json | 0 tests/sites/basic/devices/SNS-4/expected/metadata_norm.json | 0 tests/sites/downgrade/devices/DWN-2/expected/errors.map | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 tests/sites/basic/devices/SNS-4/expected/generated_config.json create mode 100644 tests/sites/basic/devices/SNS-4/expected/metadata_norm.json diff --git a/tests/sites/basic/devices/GAT-123/expected/generated_config.json b/tests/sites/basic/devices/GAT-123/expected/generated_config.json index 54762baf79..c208443dfd 100644 --- a/tests/sites/basic/devices/GAT-123/expected/generated_config.json +++ b/tests/sites/basic/devices/GAT-123/expected/generated_config.json @@ -2,6 +2,7 @@ "gateway": { "proxy_ids": [ "AHU-22", + "SNS-4", "SNS-8" ] }, diff --git a/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json b/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json index 91685b6e07..0d2e31760a 100644 --- a/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json +++ b/tests/sites/basic/devices/GAT-123/expected/metadata_norm.json @@ -6,10 +6,11 @@ "gateway": { "proxy_ids": [ "AHU-22", + "SNS-4", "SNS-8" ] }, - "hash": "51f5948a", + "hash": "6bdf3f23", "localnet": { "families": { "vendor": { diff --git a/tests/sites/basic/devices/GAT-72/expected/errors.map b/tests/sites/basic/devices/GAT-72/expected/errors.map index 02a0b3b883..e91c030d5d 100644 --- a/tests/sites/basic/devices/GAT-72/expected/errors.map +++ b/tests/sites/basic/devices/GAT-72/expected/errors.map @@ -1,6 +1,7 @@ Exceptions for GAT-72 - List of 2 exceptions + List of 3 exceptions GAT-72 proxy_id mismatch: [AHU-1, SNS-4] Should not proxy direct device AHU-1 + gateway_id mismatch for SNS-4: GAT-123 != GAT-72 While converting device config generation specified without scan_interval_sec parameter diff --git a/tests/sites/basic/devices/SNS-4/expected/errors.map b/tests/sites/basic/devices/SNS-4/expected/errors.map index a932e5a448..dac70773a2 100644 --- a/tests/sites/basic/devices/SNS-4/expected/errors.map +++ b/tests/sites/basic/devices/SNS-4/expected/errors.map @@ -1,5 +1,2 @@ Exceptions for SNS-4 - While loading device metadata for SNS-4 - While converting strict to udmi.schema.Metadata - While converting string/string to udmi.schema.Metadata - Unrecognized field "relationships" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "gateway" : { "gateway_id" : "GAT-123" }, "pointset" : { "exclude_points_from_config" : true, "points" : { "split_threshold" : { "units" : "Imperial-gallons-per-minute" }, "triangulating_axis" : { "units" : "Degrees-phase" } }, "sample_rate_sec" : 30 }, "relationships" : { "AHU-1" : [ { "kind" : "feeds" } ], "AHU-22" : [ ], "SNS-4" : [ { "kind" : "contains" } ] }, "system" : { "locatio"[truncated 283 chars]; line: 17, column: 22] (through reference chain: udmi.schema.Metadata["relationships"]) + gateway_id mismatch for SNS-4: GAT-123 != GAT-72 diff --git a/tests/sites/basic/devices/SNS-4/expected/generated_config.json b/tests/sites/basic/devices/SNS-4/expected/generated_config.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/sites/downgrade/devices/DWN-2/expected/errors.map b/tests/sites/downgrade/devices/DWN-2/expected/errors.map index 92cadf5eb3..33bb2e96cf 100644 --- a/tests/sites/downgrade/devices/DWN-2/expected/errors.map +++ b/tests/sites/downgrade/devices/DWN-2/expected/errors.map @@ -2,4 +2,4 @@ Exceptions for DWN-2 While loading device metadata for DWN-2 While converting strict to udmi.schema.Metadata While converting string/string to udmi.schema.Metadata - Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) + Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "relationships", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) From dad78a77c9a3543517928f84e51e5f9ab3eaca69 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Sun, 5 Oct 2025 08:50:11 -0700 Subject: [PATCH 12/16] Updating expected out --- .../SNS-4/expected/generated_config.json | 13 +++++ .../devices/SNS-4/expected/metadata_norm.json | 47 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/tests/sites/basic/devices/SNS-4/expected/generated_config.json b/tests/sites/basic/devices/SNS-4/expected/generated_config.json index e69de29bb2..04aa4c13d0 100644 --- a/tests/sites/basic/devices/SNS-4/expected/generated_config.json +++ b/tests/sites/basic/devices/SNS-4/expected/generated_config.json @@ -0,0 +1,13 @@ +{ + "gateway": {}, + "pointset": { + "sample_rate_sec": 30 + }, + "system": { + "metrics_rate_sec": 10, + "min_loglevel": 300, + "operation": {} + }, + "timestamp": "2020-05-01T13:39:07Z", + "version": "1.5.3" +} diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json index e69de29bb2..b391246f01 100644 --- a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json +++ b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json @@ -0,0 +1,47 @@ +{ + "gateway": { + "gateway_id": "GAT-123" + }, + "hash": "560d4018", + "pointset": { + "exclude_points_from_config": true, + "points": { + "split_threshold": { + "units": "Imperial-gallons-per-minute" + }, + "triangulating_axis": { + "units": "Degrees-phase" + } + }, + "sample_rate_sec": 30 + }, + "relationships": { + "AHU-1": [ + { + "kind": "feeds" + } + ], + "AHU-22": [], + "SNS-4": [ + { + "kind": "contains" + } + ] + }, + "system": { + "location": { + "section": "2-3N8C", + "site": "ZZ-TRI-FECTA" + }, + "min_loglevel": 300, + "physical_tag": { + "asset": { + "guid": "drw://TBA", + "name": "SNS-4", + "site": "ZZ-TRI-FECTA" + } + } + }, + "timestamp": "2020-05-01T13:39:07Z", + "version": "1.5.2" +} From 4dd6d4ea68feaf3227a6027e0056d82ee5e4c8e9 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Thu, 16 Oct 2025 21:30:31 -0700 Subject: [PATCH 13/16] Add test for complete bacnet addr --- tests/sites/basic/devices/AHU-22/expected/errors.map | 8 ++++++++ .../devices/AHU-22/expected/generated_config.json | 8 ++++---- .../basic/devices/AHU-22/expected/metadata_norm.json | 10 +++++----- tests/sites/basic/devices/AHU-22/metadata.json | 8 ++++---- .../runConfigurations/Registrar_test_site_basic.xml | 12 ++++++++++++ 5 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 tests/sites/basic/devices/AHU-22/expected/errors.map create mode 100644 validator/.idea/runConfigurations/Registrar_test_site_basic.xml diff --git a/tests/sites/basic/devices/AHU-22/expected/errors.map b/tests/sites/basic/devices/AHU-22/expected/errors.map new file mode 100644 index 0000000000..4030d88ac4 --- /dev/null +++ b/tests/sites/basic/devices/AHU-22/expected/errors.map @@ -0,0 +1,8 @@ +Exceptions for AHU-22 + schema validation errors + While converting device config + While converting point filter_differential_pressure_sensor + protocol ref AV12.present_value does not match expression ([A-Z]{2,4}):(0|[1-9][0-9]*)(#[_a-z]+)? + While converting device config + While converting point filter_differential_pressure + protocol ref null does not match expression ([A-Z]{2,4}):(0|[1-9][0-9]*)(#[_a-z]+)? diff --git a/tests/sites/basic/devices/AHU-22/expected/generated_config.json b/tests/sites/basic/devices/AHU-22/expected/generated_config.json index 4cf1e4ac3a..8f8d87d639 100644 --- a/tests/sites/basic/devices/AHU-22/expected/generated_config.json +++ b/tests/sites/basic/devices/AHU-22/expected/generated_config.json @@ -1,19 +1,19 @@ { "gateway": { "target": { - "addr": "0x65", - "family": "vendor" + "addr": "582312", + "family": "bacnet" } }, "localnet": { "families": { - "vendor": {} + "bacnet": {} } }, "pointset": { "points": { "filter_alarm_pressure_status": { - "ref": "BV11.present_value", + "ref": "BV:11#present_value", "units": "No-units" }, "filter_differential_pressure": { diff --git a/tests/sites/basic/devices/AHU-22/expected/metadata_norm.json b/tests/sites/basic/devices/AHU-22/expected/metadata_norm.json index 5a994872c9..a9dfc4487f 100644 --- a/tests/sites/basic/devices/AHU-22/expected/metadata_norm.json +++ b/tests/sites/basic/devices/AHU-22/expected/metadata_norm.json @@ -5,21 +5,21 @@ "gateway": { "gateway_id": "GAT-123", "target": { - "family": "vendor" + "family": "bacnet" } }, - "hash": "3792824a", + "hash": "ce66ce47", "localnet": { "families": { - "vendor": { - "addr": "0x65" + "bacnet": { + "addr": "582312" } } }, "pointset": { "points": { "filter_alarm_pressure_status": { - "ref": "BV11.present_value", + "ref": "BV:11#present_value", "units": "No-units" }, "filter_differential_pressure": { diff --git a/tests/sites/basic/devices/AHU-22/metadata.json b/tests/sites/basic/devices/AHU-22/metadata.json index ec7a8c68f5..0325db483c 100644 --- a/tests/sites/basic/devices/AHU-22/metadata.json +++ b/tests/sites/basic/devices/AHU-22/metadata.json @@ -3,7 +3,7 @@ "points": { "filter_alarm_pressure_status": { "units": "No-units", - "ref": "BV11.present_value" + "ref": "BV:11#present_value" }, "filter_differential_pressure_sensor": { "units": "Degrees-Celsius", @@ -36,13 +36,13 @@ "gateway": { "gateway_id": "GAT-123", "target": { - "family": "vendor" + "family": "bacnet" } }, "localnet": { "families": { - "vendor": { - "addr": "0x65" + "bacnet": { + "addr": "582312" } } }, diff --git a/validator/.idea/runConfigurations/Registrar_test_site_basic.xml b/validator/.idea/runConfigurations/Registrar_test_site_basic.xml new file mode 100644 index 0000000000..ee007aa8c2 --- /dev/null +++ b/validator/.idea/runConfigurations/Registrar_test_site_basic.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file From d5a471adf7f2a6a781b5fd263f227837aba31fed Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Wed, 22 Oct 2025 07:28:12 -0700 Subject: [PATCH 14/16] List of detils --- .gencode_hash.txt | 16 ++--- gencode/docs/metadata.html | 60 ++++++++++-------- .../udmi/schema/DetailRelationshipsModel.java | 39 ++++++++++++ .../udmi/schema/LinkRelationshipsModel.java | 50 --------------- gencode/java/udmi/schema/Metadata.java | 2 +- .../dist/udmi_schema-0.1.0-py3-none-any.whl | Bin 47828 -> 47815 bytes gencode/python/dist/udmi_schema-0.1.0.tar.gz | Bin 12715 -> 12745 bytes gencode/python/udmi/schema/__init__.py | 2 +- .../python/udmi/schema/model_relationships.py | 4 +- .../udmi/schema/model_relationships_detail.py | 15 +++++ .../udmi/schema/model_relationships_link.py | 18 ------ schema/model_relationships.json | 14 ++-- schema/model_relationships_detail.json | 7 ++ schema/model_relationships_link.json | 18 ------ 14 files changed, 115 insertions(+), 130 deletions(-) create mode 100644 gencode/java/udmi/schema/DetailRelationshipsModel.java delete mode 100644 gencode/java/udmi/schema/LinkRelationshipsModel.java create mode 100644 gencode/python/udmi/schema/model_relationships_detail.py delete mode 100644 gencode/python/udmi/schema/model_relationships_link.py create mode 100644 schema/model_relationships_detail.json delete mode 100644 schema/model_relationships_link.json diff --git a/.gencode_hash.txt b/.gencode_hash.txt index c7fbe43c58..7676519494 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -14,7 +14,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -bb113e84b46a5cd3ce0f2ee02d5f58ca8ca5a98c92abaca0b3e3fa1479776b60 gencode/docs/metadata.html +05fb63f56e56ba40919db0ebc41fe90bdc39d9100661075889623260aa786419 gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -50,6 +50,7 @@ c44f25ab2b9f17ea18c7cd5b78e4c5565ba4ecc20d426105d778c28bb6b32263 gencode/java/u 7f2d98ef9f1eef27a2aad684fda33ad79728421a228df93f502fbde981fdfbf3 gencode/java/udmi/schema/Connections.java 5a82b0496e2f907fe37ce38cd0437b59d75b458827ed5eb14a836c34982421ec gencode/java/udmi/schema/Coordinates.java 256ecb8fe4388ed5b16c4bbc292a655e423e67c3d5102f18cc053ae6110bf085 gencode/java/udmi/schema/Credential.java +5552d3de122eabb418c60f47d83af649c6b5601a66201a36c6d99701b1d80d9d gencode/java/udmi/schema/DetailRelationshipsModel.java 4cfcfcb79aed8b6a0319b17efeb43ad601cb8d7f746ab4352d8ec30e75a61274 gencode/java/udmi/schema/DeviceMappingConfig.java 625c58696de0d960d93195d79f9e88dfcd5717697fb0f0a6310e5114fb7e6438 gencode/java/udmi/schema/DeviceMappingState.java fd289a9a132a880bf0a14b80ed082ab1dcd77caab54175f8d6ccfc381d2d21ab gencode/java/udmi/schema/DevicePersistent.java @@ -85,7 +86,6 @@ d0858bd7ba306176f4e3c19eeb69ef2467afec0832b6917b72d3ab87469e4974 gencode/java/u 5a0cc53317592a868f7f23a67a7493bd571054bb25d9e28de51000ad6473dfeb gencode/java/udmi/schema/Level.java fd66ce1118548ec8ff3cb4e057ecc0a3614a1e67f0207b592024cd1214259d3f gencode/java/udmi/schema/LinkExternalsModel.java cbb7cadcff210f188d97bad8a1bb4e369518d974fb7f1eac73bad44199293cd9 gencode/java/udmi/schema/LinkExternalsSite.java -8003ea8d9ca51f8f22f0e27263ef1bb299d61dfe939874e79f5327bff1bd9987 gencode/java/udmi/schema/LinkRelationshipsModel.java 6b4c29a682d0697d5420efb9e7788ec7358d94435da288938007205b8669e180 gencode/java/udmi/schema/LocalnetConfig.java 563bd616d4eb4201237ad356a144de80a4d0d1713701049009d0dbdab9fc37be gencode/java/udmi/schema/LocalnetModel.java b250808d1818cbe5366473cf814e9949c8c17dc4b5b2b281ba5845f3a696ba97 gencode/java/udmi/schema/LocalnetState.java @@ -96,7 +96,7 @@ ca932e3a0d0da213950aa89ad7a19d94505dd478bf196946aa93436c5c8b7512 gencode/java/u edbb091621a6f5e3f7e6804c7c30c0877fab0b0455661186f37b303ed108ff26 gencode/java/udmi/schema/MappingEvents.java 2742b162c3524152f3f5fce62015139295fab7cbf8f58beb7f8287ea5d294e7c gencode/java/udmi/schema/MappingState.java 8b15a8982ccadc52d52a8083cb9e101c73f2a48e069c4d41d6e59ea914352507 gencode/java/udmi/schema/MessageTemplateData.java -4afdd01cfe0a56fe343ef4659eadc5bef0ce7a52dc78ce46b0c61b9e60c2ab0d gencode/java/udmi/schema/Metadata.java +9c224bcfd5306437cc52c090fc850ac7f1c12bab790364a24dca85790dc3d01d gencode/java/udmi/schema/Metadata.java a64167bfcec809442cff132bb59ae0600055731407858656cc7147c3a38bb7cc gencode/java/udmi/schema/Metrics.java e986aff1efca08188441a246392f8c524c2cdaae107e475657402872a9a01561 gencode/java/udmi/schema/Monitoring.java 25210c7f94b6369c43c68ed1fefba1ab3dedfe3201352055c536fd5225a4c590 gencode/java/udmi/schema/MonitoringMetric.java @@ -149,10 +149,10 @@ eadc72e31b4796273479967303513b16563af0f946d1e1c7eba1748f9b133d40 gencode/java/u 5596535c39826e904949eed7894c3ecd1ee982d974beb7469f888965af2c7845 gencode/java/udmi/schema/VirtualEquipmentLinks.java 11f8dab5296d41e86cd623a4ed27b972ae673b141907cb913397d4eb53880c59 gencode/java/udmi/schema/Water.java d2a53a067185447ce672e5521cdb073a2b2100b9384b68e87211cafc5ef8cb2a gencode/presentation/presentation.json -a460648e999930f1edcdebd1f236715a69a6860468eb86a1875215557b8e832e gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl -b14a6eaec73ae0322eb6658a276384897b63343c365b2edce584b388891c095b gencode/python/dist/udmi_schema-0.1.0.tar.gz +8d377e39a73c59d854a667fd116eb117c72c864d0f1bf0dbc279687370e49ae1 gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl +9d418f7a89b848e10d5773db987757ab78a2396fc0d126f413a613ba678ba5cf gencode/python/dist/udmi_schema-0.1.0.tar.gz 4cf98cbd132cde0cc8813ac35cf3712cb46014154c817c04ad2902c268cdd8fe gencode/python/pyproject.toml -ad6ea647b99bc0326a2d872df2417252874f5127072324c2bbf4733cc2900e97 gencode/python/udmi/schema/__init__.py +50114733a432ea19aeabd99b050ff0dd11f700ddc7db53dc8843a93bcb40e5e7 gencode/python/udmi/schema/__init__.py 478b09b7e26c07441e86e1778f7e5ce8f8fa1b3fce88b8089064347d1e2fc67b gencode/python/udmi/schema/_base.py 0e18050ec17fde8162f75a76d9dc623d3f6ddca4396441bd603189827ed21a80 gencode/python/udmi/schema/access_iot.py 32a951e2bf13f556082f8d94be079b3df6cc081b6ff59f71a82d32782cf8f8f6 gencode/python/udmi/schema/ancillary_properties.py @@ -215,8 +215,8 @@ c799ce667100201d81f02f0a5d22a4d0ef7db01035e7f08219a76a04c4507a15 gencode/python 977c2a40651b65aa68d8051fd09c796adb723575356c0791adc87e4331cdbebd gencode/python/udmi/schema/model_localnet_family.py 7a252256cce946af6750c644e91b0f09363c8e28b03dbb41c8ae3e5d0758d615 gencode/python/udmi/schema/model_pointset.py 7271212f7afa718dbcb81ff01af488c64cc4bfbd756f4e54efa8c4a5359ea47b gencode/python/udmi/schema/model_pointset_point.py -e3f4770d706c6a4aaa657be4c397e256fc1f8e3ab4e756a869dba0410aa9432b gencode/python/udmi/schema/model_relationships.py -07b7d071db5335821fa427b1b5d2f8e5c75dfdd8f1b5df042965ce15b31097cd gencode/python/udmi/schema/model_relationships_link.py +7bb2fab2c4583aec2be3989c53ee9d2021fc38c806fe4829f3df8023350557d1 gencode/python/udmi/schema/model_relationships.py +26eabc57b77f6ff42853c9c4abdd07b5c13fa11cf951e60f64f945e406f207d1 gencode/python/udmi/schema/model_relationships_detail.py 241c702f6a877f41c0ebd997c7e431ba8e6d6c0d1b21bc95a9fc57592ff094a7 gencode/python/udmi/schema/model_system.py 1db2fca012d3da953438b78acd2a5c15d94e46df8b77c459876e20ef2598dfbd gencode/python/udmi/schema/model_system_hardware.py 954806649d0e7364c482f84f75e19b01ce926990d64a79e76400f32043ddda66 gencode/python/udmi/schema/model_testing.py diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index cd58b5d586..1552230ea9 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -4783,17 +4783,32 @@

d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8z" /> - ^[A-Z]{2,6}-[1-9][0-9]*$

Type: array
- + ^[A-Z]{2,6}-[1-9][0-9]*$
Type: object
+ No Additional Properties - No Additional Items

Each item of this array must be:

+ +
-
- +
+

+ +

+
+ +
+

+ +

+

All properties whose name matches the following regular expression must respect the following conditions

+ Property name regular expression: ^[a-z]+$ +

Link Relationships Model

Type: object
-

Information about how this device relates to another device

-
+ ^[a-z]+$
Type: array
- No Additional Properties - -
+ No Additional Items

Each item of this array must be:

-
-

- -

-
- -
-
+
+ Type: string
-

The kind of relationship between the two nodes

-
Must match regular expression: ^[a-z]+$ + Detail Relationships Model

Detail Relationships Model

Type: object
+

Information for modeling noun-verb-noun relationships between devices

+
+ + -
-
+
+
diff --git a/gencode/java/udmi/schema/DetailRelationshipsModel.java b/gencode/java/udmi/schema/DetailRelationshipsModel.java new file mode 100644 index 0000000000..966fa287d1 --- /dev/null +++ b/gencode/java/udmi/schema/DetailRelationshipsModel.java @@ -0,0 +1,39 @@ + +package udmi.schema; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + + +/** + * Detail Relationships Model + *

+ * Information for modeling noun-verb-noun relationships between devices + * + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + +}) +public class DetailRelationshipsModel { + + + @Override + public int hashCode() { + int result = 1; + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof DetailRelationshipsModel) == false) { + return false; + } + DetailRelationshipsModel rhs = ((DetailRelationshipsModel) other); + return true; + } + +} diff --git a/gencode/java/udmi/schema/LinkRelationshipsModel.java b/gencode/java/udmi/schema/LinkRelationshipsModel.java deleted file mode 100644 index a8d5a034ad..0000000000 --- a/gencode/java/udmi/schema/LinkRelationshipsModel.java +++ /dev/null @@ -1,50 +0,0 @@ - -package udmi.schema; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - - -/** - * Link Relationships Model - *

- * Information about how this device relates to another device - * - */ -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({ - "kind" -}) -public class LinkRelationshipsModel { - - /** - * The kind of relationship between the two nodes - * (Required) - * - */ - @JsonProperty("kind") - @JsonPropertyDescription("The kind of relationship between the two nodes") - public String kind; - - @Override - public int hashCode() { - int result = 1; - result = ((result* 31)+((this.kind == null)? 0 :this.kind.hashCode())); - return result; - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if ((other instanceof LinkRelationshipsModel) == false) { - return false; - } - LinkRelationshipsModel rhs = ((LinkRelationshipsModel) other); - return ((this.kind == rhs.kind)||((this.kind!= null)&&this.kind.equals(rhs.kind))); - } - -} diff --git a/gencode/java/udmi/schema/Metadata.java b/gencode/java/udmi/schema/Metadata.java index 0540eac264..6005a89d72 100644 --- a/gencode/java/udmi/schema/Metadata.java +++ b/gencode/java/udmi/schema/Metadata.java @@ -130,7 +130,7 @@ public class Metadata { */ @JsonProperty("relationships") @JsonPropertyDescription("Information for modeling noun-verb-noun relationships between devices") - public Map> relationships; + public Map>> relationships; /** * Localnet Model *

diff --git a/gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl b/gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl index cfde4d0b112109a705fdb3f73376a174260fdab4..f2470d77b16935569c04d31fbeef2e618e112d62 100644 GIT binary patch delta 6922 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 ByX^n~ diff --git a/gencode/python/dist/udmi_schema-0.1.0.tar.gz b/gencode/python/dist/udmi_schema-0.1.0.tar.gz index 470f7fcc505562d6edf412b50cca093ae1a5b49c..b92634597e1cf262bf943599fb37ccaa816227ee 100644 GIT binary patch literal 12745 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 B(jNc- diff --git a/gencode/python/udmi/schema/__init__.py b/gencode/python/udmi/schema/__init__.py index 3e3ed0e2cb..fcd00c0f56 100644 --- a/gencode/python/udmi/schema/__init__.py +++ b/gencode/python/udmi/schema/__init__.py @@ -61,7 +61,7 @@ from .model_pointset import * from .model_pointset_point import * from .model_relationships import * -from .model_relationships_link import * +from .model_relationships_detail import * from .model_system import * from .model_system_hardware import * from .model_testing import * diff --git a/gencode/python/udmi/schema/model_relationships.py b/gencode/python/udmi/schema/model_relationships.py index e8fe4a1690..174e550e28 100644 --- a/gencode/python/udmi/schema/model_relationships.py +++ b/gencode/python/udmi/schema/model_relationships.py @@ -6,6 +6,6 @@ from typing import Dict, List, Optional from ._base import DataModel -from .model_relationships_link import LinkRelationshipsModel +from .model_relationships_detail import DetailRelationshipsModel -RelationshipsModel = Optional[Dict[str, List[LinkRelationshipsModel]]] +RelationshipsModel = Optional[Dict[str, Dict[str, List[DetailRelationshipsModel]]]] diff --git a/gencode/python/udmi/schema/model_relationships_detail.py b/gencode/python/udmi/schema/model_relationships_detail.py new file mode 100644 index 0000000000..ac4c793191 --- /dev/null +++ b/gencode/python/udmi/schema/model_relationships_detail.py @@ -0,0 +1,15 @@ +# generated by datamodel-codegen: +# filename: model_relationships_detail.json + +from __future__ import annotations + +from dataclasses import dataclass + +from ._base import DataModel + + +@dataclass +class DetailRelationshipsModel(DataModel): + """ + Information for modeling noun-verb-noun relationships between devices + """ diff --git a/gencode/python/udmi/schema/model_relationships_link.py b/gencode/python/udmi/schema/model_relationships_link.py deleted file mode 100644 index 6ff46a4d80..0000000000 --- a/gencode/python/udmi/schema/model_relationships_link.py +++ /dev/null @@ -1,18 +0,0 @@ -# generated by datamodel-codegen: -# filename: model_relationships_link.json - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Optional - -from ._base import DataModel - - -@dataclass -class LinkRelationshipsModel(DataModel): - """ - Information about how this device relates to another device - """ - - kind: Optional[str] = None diff --git a/schema/model_relationships.json b/schema/model_relationships.json index fcd8d4eddf..a2b2e29329 100644 --- a/schema/model_relationships.json +++ b/schema/model_relationships.json @@ -5,12 +5,18 @@ "type": "object", "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": false, - "existingJavaType": "java.util.Map>", + "existingJavaType": "java.util.Map>>", "patternProperties": { "^[A-Z]{2,6}-[1-9][0-9]*$": { - "type": "array", - "items": { - "$ref": "file:model_relationships_link.json" + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^[a-z]+$": { + "type": "array", + "items": { + "$ref": "file:model_relationships_detail.json" + } + } } } } diff --git a/schema/model_relationships_detail.json b/schema/model_relationships_detail.json new file mode 100644 index 0000000000..5b7f029145 --- /dev/null +++ b/schema/model_relationships_detail.json @@ -0,0 +1,7 @@ +{ + "$udmi_version": "1.5.3", + "title": "Detail Relationships Model", + "description": "Information for modeling noun-verb-noun relationships between devices", + "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#" +} diff --git a/schema/model_relationships_link.json b/schema/model_relationships_link.json deleted file mode 100644 index 82d2a96320..0000000000 --- a/schema/model_relationships_link.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$udmi_version": "1.5.3", - "title": "Link Relationships Model", - "description": "Information about how this device relates to another device", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "additionalProperties": false, - "properties": { - "kind": { - "description": "The kind of relationship between the two nodes", - "pattern": "^[a-z]+$", - "type": "string" - } - }, - "required": [ - "kind" - ] -} From 4b5f92717a8f3aefbcc3767d9e27193144101aa7 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Wed, 22 Oct 2025 07:33:39 -0700 Subject: [PATCH 15/16] Adding tags --- .gencode_hash.txt | 14 +- gencode/docs/metadata.html | 136 +++++++++++++++++- .../udmi/schema/DetailRelationshipsModel.java | 17 ++- gencode/java/udmi/schema/SystemModel.java | 2 +- .../dist/udmi_schema-0.1.0-py3-none-any.whl | Bin 47815 -> 47859 bytes gencode/python/dist/udmi_schema-0.1.0.tar.gz | Bin 12745 -> 12755 bytes .../udmi/schema/model_relationships_detail.py | 5 + gencode/python/udmi/schema/model_system.py | 4 +- schema/model_relationships_detail.json | 19 ++- schema/model_system.json | 1 + 10 files changed, 182 insertions(+), 16 deletions(-) diff --git a/.gencode_hash.txt b/.gencode_hash.txt index 7676519494..d8fcf9ee9e 100644 --- a/.gencode_hash.txt +++ b/.gencode_hash.txt @@ -14,7 +14,7 @@ e550539d52ce1f63b35247d425c038e5d5ba33f997eedd09e486a3bd9838c2c2 gencode/docs/e cac253f57c5c92ef32e2a5f91b6cec8229e8db1dcffcc96a58f06da068e741e7 gencode/docs/events_system.html 151c1b62db35e84e51d5ff2a7464f61ced4d7fb0c7eb795715c245ee0a1b3436 gencode/docs/events_udmi.html 73dbe799e7943ec20ac58b544998e986a39539d4ef0cb4f5023e92e7634d3124 gencode/docs/events_validation.html -05fb63f56e56ba40919db0ebc41fe90bdc39d9100661075889623260aa786419 gencode/docs/metadata.html +dbd37c286727041def7f20b21bcce1788a8d95511ffc830522f915d8fa0018c2 gencode/docs/metadata.html c86682715d348bd3dd971fa5bd925a8a3d0f3c2944c65a47c4b64fe1a5ccdea2 gencode/docs/monitoring.html 474ca16edc9f3cad2bb3ab40b6993cbced90263f762f66ee6cd246a6c4a0d18f gencode/docs/persistent_device.html e11595fd11477947a27461f8ef4fb6facb5f60e2abd6212193f7581ab123ff84 gencode/docs/properties.html @@ -50,7 +50,7 @@ c44f25ab2b9f17ea18c7cd5b78e4c5565ba4ecc20d426105d778c28bb6b32263 gencode/java/u 7f2d98ef9f1eef27a2aad684fda33ad79728421a228df93f502fbde981fdfbf3 gencode/java/udmi/schema/Connections.java 5a82b0496e2f907fe37ce38cd0437b59d75b458827ed5eb14a836c34982421ec gencode/java/udmi/schema/Coordinates.java 256ecb8fe4388ed5b16c4bbc292a655e423e67c3d5102f18cc053ae6110bf085 gencode/java/udmi/schema/Credential.java -5552d3de122eabb418c60f47d83af649c6b5601a66201a36c6d99701b1d80d9d gencode/java/udmi/schema/DetailRelationshipsModel.java +3e9493f6348b03f0e833d17b450b2b7319905acd2876cc0e7bec72ea416545fa gencode/java/udmi/schema/DetailRelationshipsModel.java 4cfcfcb79aed8b6a0319b17efeb43ad601cb8d7f746ab4352d8ec30e75a61274 gencode/java/udmi/schema/DeviceMappingConfig.java 625c58696de0d960d93195d79f9e88dfcd5717697fb0f0a6310e5114fb7e6438 gencode/java/udmi/schema/DeviceMappingState.java fd289a9a132a880bf0a14b80ed082ab1dcd77caab54175f8d6ccfc381d2d21ab gencode/java/udmi/schema/DevicePersistent.java @@ -135,7 +135,7 @@ a371232810e8a2ffb380384ca717da1ee5cc0b2e1129df9b5d8faa07ab4b1f46 gencode/java/u ffc9d3760db858b7d3d3cc1187cdb4df7d8396700f6ebdaaedb6bc3bcc8b569a gencode/java/udmi/schema/SystemDiscoveryData.java 4c1b621b16130ed993205b58e4eaa1aeef3ce2b9eb173d11720efb4df6092e9e gencode/java/udmi/schema/SystemEvents.java d36e487e0f59e6d9416c661aa6a70589a7e5b1763a2ff5a556fea7984b40200f gencode/java/udmi/schema/SystemHardware.java -f2d5c41298ad9cc1e8411ca1e094ada7d6457f1ee71743bcd163f77c51d8d9c0 gencode/java/udmi/schema/SystemModel.java +6b578b2e480bdf397afc02c1450a9b8cebd0c40867a7e9e1c0205f38d6afb61b gencode/java/udmi/schema/SystemModel.java 18a5e1e4daf656776d101aeda94021e6cab6f47f2caab88b7aba8abbbf5d2a7a gencode/java/udmi/schema/SystemState.java 7db128c5607f7f2a701e60895da9f49ae8b2c75a8daf7792fd155d537978fdd0 gencode/java/udmi/schema/TargetTestingModel.java f9c304ff024f26654ee7f6a06661a825dfaf312a4fffd0cf753f4eea5958060b gencode/java/udmi/schema/TestingModel.java @@ -149,8 +149,8 @@ eadc72e31b4796273479967303513b16563af0f946d1e1c7eba1748f9b133d40 gencode/java/u 5596535c39826e904949eed7894c3ecd1ee982d974beb7469f888965af2c7845 gencode/java/udmi/schema/VirtualEquipmentLinks.java 11f8dab5296d41e86cd623a4ed27b972ae673b141907cb913397d4eb53880c59 gencode/java/udmi/schema/Water.java d2a53a067185447ce672e5521cdb073a2b2100b9384b68e87211cafc5ef8cb2a gencode/presentation/presentation.json -8d377e39a73c59d854a667fd116eb117c72c864d0f1bf0dbc279687370e49ae1 gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl -9d418f7a89b848e10d5773db987757ab78a2396fc0d126f413a613ba678ba5cf gencode/python/dist/udmi_schema-0.1.0.tar.gz +108b07a0ff7ac73a2b44f1ee8d30bdac8170a0e2c5f7b2f61caba714f068467c gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl +27086496cadddf30c7a54eadc951e715de2c798e22d9ab891b5e6843f648b31c gencode/python/dist/udmi_schema-0.1.0.tar.gz 4cf98cbd132cde0cc8813ac35cf3712cb46014154c817c04ad2902c268cdd8fe gencode/python/pyproject.toml 50114733a432ea19aeabd99b050ff0dd11f700ddc7db53dc8843a93bcb40e5e7 gencode/python/udmi/schema/__init__.py 478b09b7e26c07441e86e1778f7e5ce8f8fa1b3fce88b8089064347d1e2fc67b gencode/python/udmi/schema/_base.py @@ -216,8 +216,8 @@ c799ce667100201d81f02f0a5d22a4d0ef7db01035e7f08219a76a04c4507a15 gencode/python 7a252256cce946af6750c644e91b0f09363c8e28b03dbb41c8ae3e5d0758d615 gencode/python/udmi/schema/model_pointset.py 7271212f7afa718dbcb81ff01af488c64cc4bfbd756f4e54efa8c4a5359ea47b gencode/python/udmi/schema/model_pointset_point.py 7bb2fab2c4583aec2be3989c53ee9d2021fc38c806fe4829f3df8023350557d1 gencode/python/udmi/schema/model_relationships.py -26eabc57b77f6ff42853c9c4abdd07b5c13fa11cf951e60f64f945e406f207d1 gencode/python/udmi/schema/model_relationships_detail.py -241c702f6a877f41c0ebd997c7e431ba8e6d6c0d1b21bc95a9fc57592ff094a7 gencode/python/udmi/schema/model_system.py +9aada0e766c478e680a863bff286b1f2233e9df4ad2acbb5f0f5edb2ce284bc6 gencode/python/udmi/schema/model_relationships_detail.py +cf69db19b9f44d4061f2907f94c548e298c40aaf6b12bddba1a56b2d5491cd6d gencode/python/udmi/schema/model_system.py 1db2fca012d3da953438b78acd2a5c15d94e46df8b77c459876e20ef2598dfbd gencode/python/udmi/schema/model_system_hardware.py 954806649d0e7364c482f84f75e19b01ce926990d64a79e76400f32043ddda66 gencode/python/udmi/schema/model_testing.py 345ee1c07dc58c9a2daabf0820e15d881c4af271a8ea85044c45cd4dca3c0afa gencode/python/udmi/schema/model_testing_target.py diff --git a/gencode/docs/metadata.html b/gencode/docs/metadata.html index 1552230ea9..c9592ee2fc 100644 --- a/gencode/docs/metadata.html +++ b/gencode/docs/metadata.html @@ -1903,7 +1903,7 @@

d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8z" /> - tagsType: array
+ tagsType: array of string

Tags associated with the device

@@ -1937,7 +1937,7 @@

d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8z" /> - tags itemsType: object
+ tags itemsType: string
Must match regular expression: ^[a-z][_a-z0-9]+$ @@ -4875,13 +4875,143 @@

Information for modeling noun-verb-noun relationships between devices

- + No Additional Properties + + + +
+
+
+

+ +

+
+ +
+
+ + Type: array of string
+

Tags associated with the device

+
+ + +

All items must be unique

No Additional Items

Each item of this array must be:

+
+
+ + + Type: string
+Must match regular expression: ^[a-z][_a-z0-9]+$ + + + + + + +
+

+
Examples:
+
[
+    "lighting"
+]
+
+
[
+    "energy",
+    "building",
+    "vendor_managed"
+]
+
+
+
+
+
+
diff --git a/gencode/java/udmi/schema/DetailRelationshipsModel.java b/gencode/java/udmi/schema/DetailRelationshipsModel.java index 966fa287d1..94a7e96121 100644 --- a/gencode/java/udmi/schema/DetailRelationshipsModel.java +++ b/gencode/java/udmi/schema/DetailRelationshipsModel.java @@ -1,8 +1,12 @@ package udmi.schema; +import java.util.Set; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyDescription; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; /** @@ -13,14 +17,23 @@ */ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({ - + "tags" }) public class DetailRelationshipsModel { + /** + * Tags associated with the device + * + */ + @JsonProperty("tags") + @JsonDeserialize(as = java.util.LinkedHashSet.class) + @JsonPropertyDescription("Tags associated with the device") + public Set tags; @Override public int hashCode() { int result = 1; + result = ((result* 31)+((this.tags == null)? 0 :this.tags.hashCode())); return result; } @@ -33,7 +46,7 @@ public boolean equals(Object other) { return false; } DetailRelationshipsModel rhs = ((DetailRelationshipsModel) other); - return true; + return ((this.tags == rhs.tags)||((this.tags!= null)&&this.tags.equals(rhs.tags))); } } diff --git a/gencode/java/udmi/schema/SystemModel.java b/gencode/java/udmi/schema/SystemModel.java index 7800ca5e33..3d1234b205 100644 --- a/gencode/java/udmi/schema/SystemModel.java +++ b/gencode/java/udmi/schema/SystemModel.java @@ -77,7 +77,7 @@ public class SystemModel { @JsonProperty("tags") @JsonDeserialize(as = java.util.LinkedHashSet.class) @JsonPropertyDescription("Tags associated with the device") - public Set tags; + public Set tags; /** * Properties of the expected physical location of the device * diff --git a/gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl b/gencode/python/dist/udmi_schema-0.1.0-py3-none-any.whl index f2470d77b16935569c04d31fbeef2e618e112d62..c5f6d3e1ea9d22d41f27a27f111323c025d9c224 100644 GIT binary patch delta 3089 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

)yffYHS|IBw5j@!tsUca+Kov= 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 diff --git a/gencode/python/udmi/schema/model_relationships_detail.py b/gencode/python/udmi/schema/model_relationships_detail.py index ac4c793191..12d798f7cb 100644 --- a/gencode/python/udmi/schema/model_relationships_detail.py +++ b/gencode/python/udmi/schema/model_relationships_detail.py @@ -4,12 +4,17 @@ from __future__ import annotations from dataclasses import dataclass +from typing import List, Optional from ._base import DataModel +Tag = Optional[str] + @dataclass class DetailRelationshipsModel(DataModel): """ Information for modeling noun-verb-noun relationships between devices """ + + tags: Optional[List[Tag]] = None diff --git a/gencode/python/udmi/schema/model_system.py b/gencode/python/udmi/schema/model_system.py index 5de71d1f54..7e5e32bfcd 100644 --- a/gencode/python/udmi/schema/model_system.py +++ b/gencode/python/udmi/schema/model_system.py @@ -4,12 +4,12 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Any, Dict, List, Optional +from typing import Dict, List, Optional from ._base import DataModel from .model_system_hardware import SystemHardware -Tag = Optional[Any] +Tag = Optional[str] @dataclass diff --git a/schema/model_relationships_detail.json b/schema/model_relationships_detail.json index 5b7f029145..7eb4296ef6 100644 --- a/schema/model_relationships_detail.json +++ b/schema/model_relationships_detail.json @@ -2,6 +2,23 @@ "$udmi_version": "1.5.3", "title": "Detail Relationships Model", "description": "Information for modeling noun-verb-noun relationships between devices", + "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", - "$schema": "http://json-schema.org/draft-07/schema#" + "additionalProperties": false, + "properties": { + "tags":{ + "description": "Tags associated with the device", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^[a-z][_a-z0-9]+$" + }, + "examples": [["lighting"], ["energy", "building", "vendor_managed"]], + "$presentation": { + "display": "show", + "style": "bold" + } + } + } } diff --git a/schema/model_system.json b/schema/model_system.json index 587e9e3cee..89df3be4c6 100644 --- a/schema/model_system.json +++ b/schema/model_system.json @@ -56,6 +56,7 @@ "type": "array", "uniqueItems": true, "items": { + "type": "string", "pattern": "^[a-z][_a-z0-9]+$" }, "examples": [["lighting"], ["energy", "building", "vendor_managed"]], From 11b76b2a6a544c1373141529cfc9cfcda5f3c193 Mon Sep 17 00:00:00 2001 From: Trevor Pering Date: Wed, 22 Oct 2025 07:45:37 -0700 Subject: [PATCH 16/16] Fixing things --- .../devices/SNS-4/expected/metadata_norm.json | 17 +++++++++++++++++ tests/sites/basic/devices/SNS-4/metadata.json | 2 +- .../downgrade/devices/DWN-2/expected/errors.map | 6 +----- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json index d1872bbd5e..f2bdb81896 100644 --- a/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json +++ b/tests/sites/basic/devices/SNS-4/expected/metadata_norm.json @@ -30,6 +30,23 @@ }, "sample_rate_sec": 30 }, + "relationships": { + "AHU-1": { + "feeds": [ + {} + ] + }, + "AHU-22": {}, + "SNS-4": { + "contains": [ + { + "tags": [ + "daily" + ] + } + ] + } + }, "system": { "location": { "section": "2-3N8C", diff --git a/tests/sites/basic/devices/SNS-4/metadata.json b/tests/sites/basic/devices/SNS-4/metadata.json index de5fcd916d..667d543041 100644 --- a/tests/sites/basic/devices/SNS-4/metadata.json +++ b/tests/sites/basic/devices/SNS-4/metadata.json @@ -25,7 +25,7 @@ "relationships": { "AHU-1": { "feeds": [{}] }, "AHU-22": { }, - "SNS-4": { "contains": [{ "tags": "daily" }] } + "SNS-4": { "contains": [{ "tags": ["daily"] }] } }, "externals": { "dbo": { diff --git a/tests/sites/downgrade/devices/DWN-2/expected/errors.map b/tests/sites/downgrade/devices/DWN-2/expected/errors.map index 676b54caf5..1e7eb5cc6b 100644 --- a/tests/sites/downgrade/devices/DWN-2/expected/errors.map +++ b/tests/sites/downgrade/devices/DWN-2/expected/errors.map @@ -2,8 +2,4 @@ Exceptions for DWN-2 While loading device metadata for DWN-2 While converting strict to udmi.schema.Metadata While converting string/string to udmi.schema.Metadata -<<<<<<< HEAD - Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "relationships", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) -======= - Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (15 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"]) ->>>>>>> master + Unrecognized field "grumpy" (class udmi.schema.Metadata), not marked as ignorable (16 known properties: "upgraded_from", "gateway", "operation", "externals", "hash", "system", "discovery", "localnet", "structure", "cloud", "timestamp", "version", "relationships", "features", "testing", "pointset"]) at [Source: (String)"{ "cloud" : { "auth_type" : "RS256" }, "grumpy" : { "reason" : "This is an intentional schema violation to test the tools" }, "hash" : "da852d15", "localnet" : { "families" : { "vendor" : { "addr" : "0x65" } } }, "pointset" : { "exclude_units_from_config" : true, "points" : { "filter_alarm_pressure_status" : { "ref" : "BV11.present_value", "units" : "No-units" }, "filter_differential_pressure" : { "[truncated 667 chars]; line: 5, column: 15] (through reference chain: udmi.schema.Metadata["grumpy"])