Six descriptors written from their pages replace the last stubs of tiers 1 and 2. A scene answers Activate and Deactivate through ctx.respond() with ActivationStarted and DeactivationStarted, the time and the cause filled in. device.raise(descriptor, name, payload) publishes DoorbellPress and the Event of a button on <root>/event with the endpoint and a new messageId; it throws a MessageError for an interface or instance the device did not declare, an event that answers a directive, a payload that does not fit and a message over 16000 bytes. TurnOn of a device with WakeOnLANController is deferred without the warning. On the wire: a doorbell has no properties object and proactivelyReported on the capability; SimpleEventSource is version 1.0, InventoryLevelSensor and WakeOnLANController version 3 (1.5.2: 1). A scene declared without options is announced as before. Alex2MQTT has no topic yet for the WakeUp event. 24 examples of the six pages are saved as fixtures. 267 tests pass, 241 before. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
33 lines
2.1 KiB
JavaScript
33 lines
2.1 KiB
JavaScript
// The topics of the Alex2MQTT contract, named once. The backend and Alex2ESP use the same names, so none of them
|
|
// can change here alone.
|
|
/** Where the backend asks for the endpoints of the root. */
|
|
export const discover = (root) => `${root}/discover`;
|
|
/** Where the bridge answers a discovery request with its endpoints. */
|
|
export const discoverReply = (root) => `${root}/discover_r`;
|
|
/** Where the backend publishes the directives for one endpoint. */
|
|
export const directive = (root, endpointId) => `${root}/${endpointId}/alexaDirective`;
|
|
/**
|
|
* What the bridge subscribes to: the discovery requests and the directives of every endpoint. Not <root>/#, which
|
|
* also delivers what the bridge itself publishes and the backend's <endpointId>/alexaDirective_e.
|
|
*/
|
|
export const subscriptions = (root) => [discover(root), directive(root, "+")];
|
|
/** The endpointId of a directive topic, null for any other topic. */
|
|
export function directiveEndpoint(root, topic) {
|
|
const [, endpointId, ...rest] = topic.startsWith(`${root}/`) ? topic.slice(root.length).split("/") : [];
|
|
return endpointId && rest.length === 1 && rest[0] === "alexaDirective" ? endpointId : null;
|
|
}
|
|
/** Where the answer to a directive goes. "alexaResponce" is how the backend and Alex2ESP spell it. */
|
|
export const response = (root, endpointId) => `${root}/${endpointId}/alexaResponce`;
|
|
/** Where the answer goes once a DeferredResponse was sent for the directive. */
|
|
export const deferred = (root, endpointId) => `${root}/${endpointId}/deferredResponse`;
|
|
/** How long Alex2MQTT waits for the answer to a directive before it tells Alexa that the endpoint did not answer. */
|
|
export const DIRECTIVE_BUDGET_MS = 7000;
|
|
/** Where every ChangeReport of the root goes: the backend adds the user's token and posts it to Alexa. */
|
|
export const changeReport = (root) => `${root}/changeReport`;
|
|
/**
|
|
* Where the events go that a device raises by itself, a DoorbellPress: the backend adds the user's token and posts
|
|
* them to Alexa. It takes 30 events a minute from a root.
|
|
*/
|
|
export const event = (root) => `${root}/event`;
|
|
/** The backend drops an event that is longer, as JSON. */
|
|
export const EVENT_BYTES = 16000;
|