The bridge subscribed to <root>/#, so the broker sent back every discover_r, alexaResponce and changeReport
the bridge published, and the backend's <endpointId>/alexaDirective_e. It now subscribes to <root>/discover
and <root>/+/alexaDirective, both named in src/topics.ts; a directive topic is recognised by the root and the
last segment instead of by counting three segments.
The test reads the subscriptions from the broker, publishes seven other topics under the root and one
directive for each of two endpoints: the bridge receives the two directives and the discovery request,
nothing else. Tests: 148 -> 150 (the count in the body of 6789a1a, 108 -> 113, should read 143 -> 148).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
82 lines
4.2 KiB
TypeScript
82 lines
4.2 KiB
TypeScript
import type { IClientOptions } from "mqtt";
|
|
import Device from "./device/Device.js";
|
|
import type { EndpointDefinition } from "./device/Device.js";
|
|
import { EventEmitter } from "events";
|
|
import { DisplayCategory } from "./compat/enums.js";
|
|
/** Optional settings for the bridge (1.5.1). Everything has the 1.4.0 behaviour as its default. */
|
|
export interface Alex2MQTTOptions {
|
|
/** The broker URL. Default: the public Alex2MQTT broker, mqtt://Alex2MQTT.stormysdream.club:1883. */
|
|
host?: string;
|
|
/** Extra mqtt.js client options (reconnectPeriod, connectTimeout, clientId, ...). Merged over the defaults. */
|
|
mqtt?: IClientOptions;
|
|
/** Where log lines go. Default: console (only when debugLogging is on). */
|
|
log?: (message: string, detail?: unknown) => void;
|
|
/**
|
|
* false: discovery does not list the Alexa interface on the endpoints. Default: every endpoint ends with
|
|
* { type: "AlexaInterface", interface: "Alexa", version: "3" }, which Amazon requires and 1.x left out.
|
|
*/
|
|
alexaInterface?: boolean;
|
|
}
|
|
export declare const DEFAULT_HOST = "mqtt://Alex2MQTT.stormysdream.club:1883";
|
|
/**
|
|
* The Alexa-to-MQTT bridge: one broker connection for a user's root topic, a set of registered devices, discovery and
|
|
* directive dispatch.
|
|
*
|
|
* Events (all optional to listen to - since 1.5.1 a broker outage never throws out of the library):
|
|
* "connect" connected (or reconnected) and subscribed to <root>/discover and <root>/+/alexaDirective
|
|
* "offline" the connection dropped; mqtt.js reconnects on its own (reconnectPeriod, default 1 s)
|
|
* "reconnect" a reconnect attempt starts
|
|
* "close" the connection closed
|
|
* "error" (err) a connection or publish error. Emitted ONLY when a listener is attached (1.4.0 emitted it
|
|
* unconditionally, and Node kills a process that has an unhandled "error" event)
|
|
* "discover" (n) a discovery request was answered with n devices
|
|
* "directive" (info) a directive was dispatched to a device: { endpointId, namespace, name }
|
|
*/
|
|
declare class Alex2MQTT extends EventEmitter {
|
|
private username;
|
|
private password;
|
|
private rootTopic;
|
|
private debugLogging;
|
|
private client;
|
|
private readonly publisher;
|
|
private devices;
|
|
private MqttHost;
|
|
private options;
|
|
private logged;
|
|
/** true while the broker connection is up. */
|
|
connected: boolean;
|
|
/** ISO time of the last discovery request answered, null before the first. */
|
|
lastDiscoveryAt: string | null;
|
|
constructor(username: string, password: string, rootTopic: string, debugLogging?: boolean, options?: Alex2MQTTOptions);
|
|
private log;
|
|
/** Emit "error" only when somebody listens: an unhandled "error" event would crash the host process. */
|
|
private fail;
|
|
connect(): void;
|
|
private describeDevices;
|
|
/** Close the broker connection (resolves once closed). The devices stay registered; connect() again reuses them. */
|
|
disconnect(): Promise<void>;
|
|
/**
|
|
* Declare a device:
|
|
*
|
|
* const blinds = bridge.addDevice({ endpointId: "bedroom-blinds", name: "Bedroom Blinds",
|
|
* categories: ["INTERIOR_BLIND"], manufacturerName: "Acme", description: "Roller blind by Acme" });
|
|
*
|
|
* Throws a DeclarationError when Alexa would reject the endpoint (an endpointId with a slash, a name with
|
|
* punctuation) or when the endpointId is registered already. Discovery lists Alexa.EndpointHealth for the device
|
|
* unless endpointHealth is false. A device can be declared before connect(): what it sends before the bridge has
|
|
* a connection is not published, and the "error" event says so.
|
|
*/
|
|
addDevice(definition: EndpointDefinition): Device;
|
|
registerDevice(name: string, endpointId: string, displayCategory?: DisplayCategory | DisplayCategory[] | null): Device;
|
|
private register;
|
|
/** Forget a device (its listeners with it). Returns false when there was none. */
|
|
unregisterDevice(endpointId: string): boolean;
|
|
/** Forget every device. */
|
|
clearDevices(): void;
|
|
private release;
|
|
getDevices(): Device[];
|
|
getDevice(endpointId: string): Device | undefined;
|
|
getRootTopic(): string;
|
|
getHost(): string;
|
|
}
|
|
export default Alex2MQTT;
|