Skip to content

Commit 8554b5c

Browse files
refactor: add required AID terms (if missing) based on op (#1164)
1 parent a494687 commit 8554b5c

2 files changed

Lines changed: 79 additions & 1 deletion

File tree

packages/td-tools/src/util/asset-interface-description.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,82 @@ export class AssetInterfaceDescriptionUtil {
10851085
return formElementPicked;
10861086
}
10871087

1088+
private hasOp(form: FormElementBase, op: string): boolean {
1089+
if (form.op != null) {
1090+
if (typeof form.op === "string" && form.op === op) {
1091+
return true;
1092+
} else if (Array.isArray(form.op) && form.op.includes(op)) {
1093+
return true;
1094+
}
1095+
}
1096+
return false;
1097+
}
1098+
1099+
private addRequiredAidTermsForForm(form: FormElementBase, protocol: string): void {
1100+
if (form == null || protocol == null) {
1101+
return;
1102+
}
1103+
if (protocol.startsWith("http")) {
1104+
// HTTP: href, htv_methodName
1105+
// default for htv:methodName depending on op, see https://w3c.github.io/wot-binding-templates/bindings/protocols/http/index.html#http-default-vocabulary-terms
1106+
const htvKey = "htv:methodName";
1107+
if (form[htvKey] == null) {
1108+
if (
1109+
this.hasOp(form, "readproperty") ||
1110+
this.hasOp(form, "readallproperties") ||
1111+
this.hasOp(form, "readmultipleproperties")
1112+
) {
1113+
form[htvKey] = "GET";
1114+
} else if (
1115+
this.hasOp(form, "writeproperty") ||
1116+
this.hasOp(form, "writeallproperties") ||
1117+
this.hasOp(form, "writemultipleproperties")
1118+
) {
1119+
form[htvKey] = "PUT";
1120+
} else if (this.hasOp(form, "invokeaction")) {
1121+
form[htvKey] = "POST";
1122+
}
1123+
}
1124+
} else if (protocol.startsWith("modbus")) {
1125+
// Modbus: href, modbus_function
1126+
// default for modbus:function depending on op, see https://w3c.github.io/wot-binding-templates/bindings/protocols/modbus/index.html#default-mappings
1127+
const mbKey = "modbus:function";
1128+
if (form[mbKey] == null) {
1129+
if (this.hasOp(form, "writeproperty") || this.hasOp(form, "invokeaction")) {
1130+
form[mbKey] = "writeSingleCoil";
1131+
} else if (this.hasOp(form, "readallproperties") || this.hasOp(form, "readmultipleproperties")) {
1132+
form[mbKey] = "readHoldingRegisters";
1133+
} else if (this.hasOp(form, "writeallproperties") || this.hasOp(form, "writemultipleproperties")) {
1134+
form[mbKey] = "writeMultipleHoldingRegisters";
1135+
}
1136+
}
1137+
} else if (protocol.startsWith("mqtt")) {
1138+
// MQTT: href, mqv_controlPacket
1139+
// default for mqv:controlPacket depending on op, see https://w3c.github.io/wot-binding-templates/bindings/protocols/mqtt/index.html#default-mappings
1140+
const mqvKey = "mqv:controlPacket";
1141+
if (form[mqvKey] == null) {
1142+
if (
1143+
this.hasOp(form, "readproperty") ||
1144+
this.hasOp(form, "observeproperty") ||
1145+
this.hasOp(form, "readallproperties") ||
1146+
this.hasOp(form, "readmultipleproperties") ||
1147+
this.hasOp(form, "subscribeevent")
1148+
) {
1149+
form[mqvKey] = "subscribe";
1150+
} else if (
1151+
this.hasOp(form, "writeproperty") ||
1152+
this.hasOp(form, "writeallproperties") ||
1153+
this.hasOp(form, "writemultipleproperties") ||
1154+
this.hasOp(form, "invokeaction")
1155+
) {
1156+
form[mqvKey] = "publish";
1157+
} else if (this.hasOp(form, "unobserveproperty") || this.hasOp(form, "unsubscribeevent")) {
1158+
form[mqvKey] = "unsubscribe";
1159+
}
1160+
}
1161+
}
1162+
}
1163+
10881164
private createInterfaceMetadata(td: ThingDescription, protocol: string): Record<string, unknown> {
10891165
const properties: Array<unknown> = [];
10901166
const actions: Array<unknown> = [];
@@ -1264,6 +1340,9 @@ export class AssetInterfaceDescriptionUtil {
12641340
// TODO AID for now supports just *one* href/form
12651341
// --> pick the first one that matches protocol (other means in future?)
12661342

1343+
// AID has required terms that need to be present always for a given interface
1344+
this.addRequiredAidTermsForForm(formElementPicked, protocol);
1345+
12671346
// walk over string values like: "href", "contentType", "htv:methodName", ...
12681347
for (let formTerm in formElementPicked) {
12691348
let formValue = formElementPicked[formTerm];

packages/td-tools/test/AssetInterfaceDescriptionTest.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,6 @@ class AssetInterfaceDescriptionUtilTest {
534534
{
535535
href: "stat",
536536
contentType: "application/json",
537-
"htv:methodName": "GET",
538537
op: ["readproperty"],
539538
},
540539
],

0 commit comments

Comments
 (0)