Ten recipes: lamp, colour lamp, thermostat, blind, lock (deferred), contact sensor (ChangeReport), scene, doorbell (raise), typed errors, and a plug as an ES module. Each reads ALEX2MQTT_USERNAME, _PASSWORD and _ROOT_TOPIC and names the ones that are missing. The nine examples of 1.5.2 move to examples/legacy unchanged. test/examples.test.js starts every file with node, its broker connection sent to a broker on 127.0.0.1 (test/helpers/loopback.js), discovers the device, sends directives and checks the answers. A legacy file is started and its discovery compared with the answer the 1.5.2 build gave, recorded in test/fixtures/legacy-examples. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
40 lines
1.9 KiB
JavaScript
40 lines
1.9 KiB
JavaScript
// 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 <root>/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();
|