// Guarded relay (door-open) test for the UHPPOTE controller. // // Prompts before firing each relay so a door only opens when you're ready and // watching. This is a 2-door controller, so it tests doors 1 and 2 by default. // // node apps/server/scripts/uhppote-relay.mjs # doors 1,2 (prompted) // node apps/server/scripts/uhppote-relay.mjs 1 # only door 1 // YES=1 node apps/server/scripts/uhppote-relay.mjs # no prompts (fires!) // // SAFETY: openDoor only expresses INTENT to open. The controller / barrier // operator owns the close timing and anti-crush — we never time a close. import { createInterface } from "node:readline/promises"; import { stdin, stdout } from "node:process"; import { controller, makeCtx, uhppoted } from "./uhppote-common.mjs"; const ctx = makeCtx(); const doors = process.argv.slice(2).map(Number).filter((n) => n >= 1 && n <= 4); const targets = doors.length ? doors : [1, 2]; const autoYes = process.env.YES === "1"; console.log(`controller : ${controller.id} @ ${controller.address}`); console.log(`testing doors: ${targets.join(", ")}${autoYes ? " (auto, no prompts)" : ""}\n`); const rl = autoYes ? null : createInterface({ input: stdin, output: stdout }); for (const door of targets) { if (rl) { const ans = await rl.question(`Open door ${door}? [y/N] `); if (ans.trim().toLowerCase() !== "y") { console.log(` skipped door ${door}`); continue; } } try { const res = await uhppoted.openDoor(ctx, controller, door); console.log(` door ${door}: openDoor -> ${JSON.stringify(res)}`); } catch (e) { console.log(` door ${door}: ERROR ${e.code ?? e.message}`); } } rl?.close(); console.log("\ndone.");