advanced write scenarios 1
1. Conditional Multi-Write
// Write different sets based on conditions
const mode = flow.get("operationMode") || "manual";
let writes = [];
switch (mode) {
case "automatic":
writes = [
{ nodeId: "ns=2;s=AutoMode", value: true },
{ nodeId: "ns=2;s=SetpointAuto", value: 50.0 },
{ nodeId: "ns=2;s=ControllerEnabled", value: true }
];
break;
case "manual":
writes = [
{ nodeId: "ns=2;s=AutoMode", value: false },
{ nodeId: "ns=2;s=ManualOutput", value: 25.0 },
{ nodeId: "ns=2;s=ControllerEnabled", value: false }
];
break;
case "maintenance":
writes = [
{ nodeId: "ns=2;s=MaintenanceMode", value: true },
{ nodeId: "ns=2;s=AllValvesClose", value: true },
{ nodeId: "ns=2;s=SafetyShutdown", value: true }
];
break;
}
msg.payload = writes;
return msg;
2. Data Validation Before Write
// Validate all data before writing
const writes = msg.payload || [];
const validatedWrites = [];
const validationErrors = [];
writes.forEach((write, index) => {
let isValid = true;
let errorMsg = "";
// Check nodeId format
if (!write.nodeId || typeof write.nodeId !== "string") {
isValid = false;
errorMsg = "Invalid nodeId";
}
// Check value ranges based on nodeId
if (write.nodeId.includes("Temperature")) {
if (write.value < -50 || write.value > 200) {
isValid = false;
errorMsg = "Temperature out of range (-50 to 200)";
}
}
if (write.nodeId.includes("Pressure")) {
if (write.value < 0 || write.value > 10) {
isValid = false;
errorMsg = "Pressure out of range (0 to 10)";
}
}
if (isValid) {
validatedWrites.push(write);
} else {
validationErrors.push({
index: index,
nodeId: write.nodeId,
value: write.value,
error: errorMsg
});
}
});
if (validationErrors.length > 0) {
node.warn(`Validation errors: ${JSON.stringify(validationErrors)}`);
}
if (validatedWrites.length > 0) {
msg.payload = validatedWrites;
msg.validationErrors = validationErrors;
return msg;
} else {
node.error("All write operations failed validation");
return null;
}