// A doorbell: Alexa.DoorbellEventSource. It takes no directive and reports no state of the button; // device.raise() says that somebody rang. Press Enter to ring. // // The event is published to /event. Not tested with an Alexa account yet: whether the press reaches Alexa // depends on the Alex2MQTT service relaying that topic. Alexa wants 30 seconds between two presses of one doorbell. // // ALEX2MQTT_USERNAME=... ALEX2MQTT_PASSWORD=... ALEX2MQTT_ROOT_TOPIC=... node examples/doorbell.js // // "alex2node" is the installed package; inside this checkout it resolves to the built dist/. const { Alex2MQTT, DoorbellEventSource } = require("alex2node"); const missing = ["ALEX2MQTT_USERNAME", "ALEX2MQTT_PASSWORD", "ALEX2MQTT_ROOT_TOPIC"].filter((name) => !process.env[name]); if (missing.length > 0) { console.error(`${missing.join(", ")} not set. Set the MQTT user name, the password and the root topic of your Alex2MQTT account.`); process.exit(1); } const { ALEX2MQTT_USERNAME, ALEX2MQTT_PASSWORD, ALEX2MQTT_ROOT_TOPIC } = process.env; const bridge = new Alex2MQTT(ALEX2MQTT_USERNAME, ALEX2MQTT_PASSWORD, ALEX2MQTT_ROOT_TOPIC); bridge.on("connect", () => console.log("connected, discover the devices in the Alexa app")); bridge.on("error", (err) => console.error("bridge:", err.message)); const device = bridge.addDevice({ endpointId: "front-doorbell", name: "Front Doorbell", categories: ["DOORBELL"] }); device.add(DoorbellEventSource); device.state((s) => s.health("OK")); let rangAt = 0; process.stdin.on("data", async () => { if (Date.now() - rangAt < 30000) { console.log("not sent: the last press is less than 30 seconds ago"); return; } rangAt = Date.now(); // raise() throws for an event the device did not declare, and resolves with what became of the publish const result = await device.raise(DoorbellEventSource, "DoorbellPress"); console.log(result.ok ? "the press was sent" : `not sent: ${result.error.message}`); }); bridge.connect();