registry: Speaker, StepSpeaker, EqualizerController, PlaybackController, PlaybackStateReporter, InputController, ChannelController
Seven descriptors written from their pages replace seven stubs. All are version 3; 1.5.2 announced Speaker, StepSpeaker, EqualizerController and PlaybackStateReporter as version 1, and all but ChannelController without a property. StepSpeaker has no properties object in discovery and PlaybackController one without fields, next to supportedOperations; a directive for an operation the device did not list is answered with INVALID_DIRECTIVE. The equalizer declares bands, modes or both under "configurations", a TV its inputs from the 61 names of the page. Not described: the lineup of ChannelController, whose discovery example the page folds away. The discovery examples of InputController spell one key "friendNames"; the fixtures have friendlyNames, as its table does. 62 examples of the six pages are saved as fixtures. 241 tests pass, 215 before. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
c59cf3ff10
commit
d7dfc5b122
113 changed files with 3948 additions and 47 deletions
12
dist/cjs/index.js
vendored
12
dist/cjs/index.js
vendored
|
|
@ -36,8 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.DisplayCategory = exports.AlexaInterfaceType = exports.AlexaErrorType = exports.AlexaActions = exports.ActionMapping = exports.AlexaInterface = exports.MemoryPublisher = exports.topics = exports.property = exports.StateBuilder = exports.MessageError = exports.AlexaErrors = exports.AlexaError = exports.messages = exports.ThermostatModes = exports.DisplayCategories = exports.States = exports.Actions = exports.Units = exports.Assets = exports.SemanticsBuilder = exports.semantics = exports.text = exports.asset = exports.EndpointHealth = exports.PowerController = exports.ToggleController = exports.ThermostatControllerSchedule = exports.ThermostatController = exports.TemperatureSensor = exports.SecurityPanelController = exports.RangeController = exports.PowerLevelController = exports.PercentageController = exports.MotionSensor = exports.ModeController = exports.LockController = exports.HumiditySensor = exports.ContactSensor = exports.ColorTemperatureController = exports.ColorController = exports.BrightnessController = exports.Alexa = exports.SchemaError = exports.DeclarationError = exports.registry = exports.Capability = exports.Device = exports.DEFAULT_HOST = exports.Alex2MQTT = void 0;
|
||||
exports.AlexaErrorResponse = exports.AlexaStatusMessage = exports.ThermostatMode = exports.TemperatureSensorScale = exports.PowerState = void 0;
|
||||
exports.property = exports.StateBuilder = exports.MessageError = exports.AlexaErrors = exports.AlexaError = exports.messages = exports.ThermostatModes = exports.Inputs = exports.DisplayCategories = exports.States = exports.Actions = exports.Units = exports.Assets = exports.SemanticsBuilder = exports.semantics = exports.text = exports.asset = exports.EndpointHealth = exports.PowerController = exports.ToggleController = exports.ThermostatControllerSchedule = exports.ThermostatController = exports.TemperatureSensor = exports.StepSpeaker = exports.Speaker = exports.SecurityPanelController = exports.RangeController = exports.PowerLevelController = exports.PlaybackStateReporter = exports.PlaybackController = exports.PercentageController = exports.MotionSensor = exports.ModeController = exports.LockController = exports.InputController = exports.HumiditySensor = exports.EqualizerController = exports.ContactSensor = exports.ColorTemperatureController = exports.ColorController = exports.ChannelController = exports.BrightnessController = exports.Alexa = exports.SchemaError = exports.DeclarationError = exports.registry = exports.Capability = exports.Device = exports.DEFAULT_HOST = exports.Alex2MQTT = void 0;
|
||||
exports.AlexaErrorResponse = exports.AlexaStatusMessage = exports.ThermostatMode = exports.TemperatureSensorScale = exports.PowerState = exports.DisplayCategory = exports.AlexaInterfaceType = exports.AlexaErrorType = exports.AlexaActions = exports.ActionMapping = exports.AlexaInterface = exports.MemoryPublisher = exports.topics = void 0;
|
||||
// Relative specifiers carry ".js": Node's ES module loader resolves no extension, and TypeScript maps it back to the .ts.
|
||||
var Alex2Node_js_1 = require("./Alex2Node.js");
|
||||
Object.defineProperty(exports, "Alex2MQTT", { enumerable: true, get: function () { return __importDefault(Alex2Node_js_1).default; } });
|
||||
|
|
@ -54,17 +54,24 @@ Object.defineProperty(exports, "SchemaError", { enumerable: true, get: function
|
|||
var index_js_2 = require("./registry/index.js");
|
||||
Object.defineProperty(exports, "Alexa", { enumerable: true, get: function () { return index_js_2.Alexa; } });
|
||||
Object.defineProperty(exports, "BrightnessController", { enumerable: true, get: function () { return index_js_2.BrightnessController; } });
|
||||
Object.defineProperty(exports, "ChannelController", { enumerable: true, get: function () { return index_js_2.ChannelController; } });
|
||||
Object.defineProperty(exports, "ColorController", { enumerable: true, get: function () { return index_js_2.ColorController; } });
|
||||
Object.defineProperty(exports, "ColorTemperatureController", { enumerable: true, get: function () { return index_js_2.ColorTemperatureController; } });
|
||||
Object.defineProperty(exports, "ContactSensor", { enumerable: true, get: function () { return index_js_2.ContactSensor; } });
|
||||
Object.defineProperty(exports, "EqualizerController", { enumerable: true, get: function () { return index_js_2.EqualizerController; } });
|
||||
Object.defineProperty(exports, "HumiditySensor", { enumerable: true, get: function () { return index_js_2.HumiditySensor; } });
|
||||
Object.defineProperty(exports, "InputController", { enumerable: true, get: function () { return index_js_2.InputController; } });
|
||||
Object.defineProperty(exports, "LockController", { enumerable: true, get: function () { return index_js_2.LockController; } });
|
||||
Object.defineProperty(exports, "ModeController", { enumerable: true, get: function () { return index_js_2.ModeController; } });
|
||||
Object.defineProperty(exports, "MotionSensor", { enumerable: true, get: function () { return index_js_2.MotionSensor; } });
|
||||
Object.defineProperty(exports, "PercentageController", { enumerable: true, get: function () { return index_js_2.PercentageController; } });
|
||||
Object.defineProperty(exports, "PlaybackController", { enumerable: true, get: function () { return index_js_2.PlaybackController; } });
|
||||
Object.defineProperty(exports, "PlaybackStateReporter", { enumerable: true, get: function () { return index_js_2.PlaybackStateReporter; } });
|
||||
Object.defineProperty(exports, "PowerLevelController", { enumerable: true, get: function () { return index_js_2.PowerLevelController; } });
|
||||
Object.defineProperty(exports, "RangeController", { enumerable: true, get: function () { return index_js_2.RangeController; } });
|
||||
Object.defineProperty(exports, "SecurityPanelController", { enumerable: true, get: function () { return index_js_2.SecurityPanelController; } });
|
||||
Object.defineProperty(exports, "Speaker", { enumerable: true, get: function () { return index_js_2.Speaker; } });
|
||||
Object.defineProperty(exports, "StepSpeaker", { enumerable: true, get: function () { return index_js_2.StepSpeaker; } });
|
||||
Object.defineProperty(exports, "TemperatureSensor", { enumerable: true, get: function () { return index_js_2.TemperatureSensor; } });
|
||||
Object.defineProperty(exports, "ThermostatController", { enumerable: true, get: function () { return index_js_2.ThermostatController; } });
|
||||
Object.defineProperty(exports, "ThermostatControllerSchedule", { enumerable: true, get: function () { return index_js_2.ThermostatControllerSchedule; } });
|
||||
|
|
@ -84,6 +91,7 @@ Object.defineProperty(exports, "Units", { enumerable: true, get: function () { r
|
|||
Object.defineProperty(exports, "Actions", { enumerable: true, get: function () { return index_js_4.ACTIONS; } });
|
||||
Object.defineProperty(exports, "States", { enumerable: true, get: function () { return index_js_4.STATES; } });
|
||||
Object.defineProperty(exports, "DisplayCategories", { enumerable: true, get: function () { return index_js_4.DISPLAY_CATEGORIES; } });
|
||||
Object.defineProperty(exports, "Inputs", { enumerable: true, get: function () { return index_js_4.INPUTS; } });
|
||||
Object.defineProperty(exports, "ThermostatModes", { enumerable: true, get: function () { return index_js_4.THERMOSTAT_MODES; } });
|
||||
// The messages: what the bridge publishes, built from plain values
|
||||
exports.messages = __importStar(require("./messages/index.js"));
|
||||
|
|
|
|||
25
dist/cjs/registry/index.js
vendored
25
dist/cjs/registry/index.js
vendored
|
|
@ -14,12 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|||
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.SchemaError = exports.s = exports.defineInterface = exports.DeclarationError = exports.SemanticsBuilder = exports.semantics = exports.text = exports.asset = exports.THERMOSTAT_MODES = exports.ToggleController = exports.ThermostatControllerSchedule = exports.ThermostatController = exports.TemperatureSensor = exports.SecurityPanelController = exports.RangeController = exports.PowerLevelController = exports.PowerController = exports.PercentageController = exports.MotionSensor = exports.ModeController = exports.LockController = exports.HumiditySensor = exports.EndpointHealth = exports.ContactSensor = exports.ColorTemperatureController = exports.ColorController = exports.BrightnessController = exports.Alexa = exports.registry = void 0;
|
||||
exports.SchemaError = exports.s = exports.defineInterface = exports.DeclarationError = exports.SemanticsBuilder = exports.semantics = exports.text = exports.asset = exports.THERMOSTAT_MODES = exports.INPUTS = exports.ToggleController = exports.ThermostatControllerSchedule = exports.ThermostatController = exports.TemperatureSensor = exports.StepSpeaker = exports.Speaker = exports.SecurityPanelController = exports.RangeController = exports.PowerLevelController = exports.PowerController = exports.PlaybackStateReporter = exports.PlaybackController = exports.PercentageController = exports.MotionSensor = exports.ModeController = exports.LockController = exports.InputController = exports.HumiditySensor = exports.EqualizerController = exports.EndpointHealth = exports.ContactSensor = exports.ColorTemperatureController = exports.ColorController = exports.ChannelController = exports.BrightnessController = exports.Alexa = exports.registry = void 0;
|
||||
// The interfaces the library knows, by namespace.
|
||||
const Alexa_js_1 = require("./interfaces/Alexa.js");
|
||||
Object.defineProperty(exports, "Alexa", { enumerable: true, get: function () { return Alexa_js_1.Alexa; } });
|
||||
const BrightnessController_js_1 = require("./interfaces/BrightnessController.js");
|
||||
Object.defineProperty(exports, "BrightnessController", { enumerable: true, get: function () { return BrightnessController_js_1.BrightnessController; } });
|
||||
const ChannelController_js_1 = require("./interfaces/ChannelController.js");
|
||||
Object.defineProperty(exports, "ChannelController", { enumerable: true, get: function () { return ChannelController_js_1.ChannelController; } });
|
||||
const ColorController_js_1 = require("./interfaces/ColorController.js");
|
||||
Object.defineProperty(exports, "ColorController", { enumerable: true, get: function () { return ColorController_js_1.ColorController; } });
|
||||
const ColorTemperatureController_js_1 = require("./interfaces/ColorTemperatureController.js");
|
||||
|
|
@ -28,8 +30,12 @@ const ContactSensor_js_1 = require("./interfaces/ContactSensor.js");
|
|||
Object.defineProperty(exports, "ContactSensor", { enumerable: true, get: function () { return ContactSensor_js_1.ContactSensor; } });
|
||||
const EndpointHealth_js_1 = require("./interfaces/EndpointHealth.js");
|
||||
Object.defineProperty(exports, "EndpointHealth", { enumerable: true, get: function () { return EndpointHealth_js_1.EndpointHealth; } });
|
||||
const EqualizerController_js_1 = require("./interfaces/EqualizerController.js");
|
||||
Object.defineProperty(exports, "EqualizerController", { enumerable: true, get: function () { return EqualizerController_js_1.EqualizerController; } });
|
||||
const HumiditySensor_js_1 = require("./interfaces/HumiditySensor.js");
|
||||
Object.defineProperty(exports, "HumiditySensor", { enumerable: true, get: function () { return HumiditySensor_js_1.HumiditySensor; } });
|
||||
const InputController_js_1 = require("./interfaces/InputController.js");
|
||||
Object.defineProperty(exports, "InputController", { enumerable: true, get: function () { return InputController_js_1.InputController; } });
|
||||
const LockController_js_1 = require("./interfaces/LockController.js");
|
||||
Object.defineProperty(exports, "LockController", { enumerable: true, get: function () { return LockController_js_1.LockController; } });
|
||||
const ModeController_js_1 = require("./interfaces/ModeController.js");
|
||||
|
|
@ -38,6 +44,10 @@ const MotionSensor_js_1 = require("./interfaces/MotionSensor.js");
|
|||
Object.defineProperty(exports, "MotionSensor", { enumerable: true, get: function () { return MotionSensor_js_1.MotionSensor; } });
|
||||
const PercentageController_js_1 = require("./interfaces/PercentageController.js");
|
||||
Object.defineProperty(exports, "PercentageController", { enumerable: true, get: function () { return PercentageController_js_1.PercentageController; } });
|
||||
const PlaybackController_js_1 = require("./interfaces/PlaybackController.js");
|
||||
Object.defineProperty(exports, "PlaybackController", { enumerable: true, get: function () { return PlaybackController_js_1.PlaybackController; } });
|
||||
const PlaybackStateReporter_js_1 = require("./interfaces/PlaybackStateReporter.js");
|
||||
Object.defineProperty(exports, "PlaybackStateReporter", { enumerable: true, get: function () { return PlaybackStateReporter_js_1.PlaybackStateReporter; } });
|
||||
const PowerController_js_1 = require("./interfaces/PowerController.js");
|
||||
Object.defineProperty(exports, "PowerController", { enumerable: true, get: function () { return PowerController_js_1.PowerController; } });
|
||||
const PowerLevelController_js_1 = require("./interfaces/PowerLevelController.js");
|
||||
|
|
@ -46,6 +56,10 @@ const RangeController_js_1 = require("./interfaces/RangeController.js");
|
|||
Object.defineProperty(exports, "RangeController", { enumerable: true, get: function () { return RangeController_js_1.RangeController; } });
|
||||
const SecurityPanelController_js_1 = require("./interfaces/SecurityPanelController.js");
|
||||
Object.defineProperty(exports, "SecurityPanelController", { enumerable: true, get: function () { return SecurityPanelController_js_1.SecurityPanelController; } });
|
||||
const Speaker_js_1 = require("./interfaces/Speaker.js");
|
||||
Object.defineProperty(exports, "Speaker", { enumerable: true, get: function () { return Speaker_js_1.Speaker; } });
|
||||
const StepSpeaker_js_1 = require("./interfaces/StepSpeaker.js");
|
||||
Object.defineProperty(exports, "StepSpeaker", { enumerable: true, get: function () { return StepSpeaker_js_1.StepSpeaker; } });
|
||||
const TemperatureSensor_js_1 = require("./interfaces/TemperatureSensor.js");
|
||||
Object.defineProperty(exports, "TemperatureSensor", { enumerable: true, get: function () { return TemperatureSensor_js_1.TemperatureSensor; } });
|
||||
const ThermostatController_js_1 = require("./interfaces/ThermostatController.js");
|
||||
|
|
@ -59,19 +73,26 @@ const types_js_1 = require("./types.js");
|
|||
const described = [
|
||||
Alexa_js_1.Alexa,
|
||||
BrightnessController_js_1.BrightnessController,
|
||||
ChannelController_js_1.ChannelController,
|
||||
ColorController_js_1.ColorController,
|
||||
ColorTemperatureController_js_1.ColorTemperatureController,
|
||||
ContactSensor_js_1.ContactSensor,
|
||||
EndpointHealth_js_1.EndpointHealth,
|
||||
EqualizerController_js_1.EqualizerController,
|
||||
HumiditySensor_js_1.HumiditySensor,
|
||||
InputController_js_1.InputController,
|
||||
LockController_js_1.LockController,
|
||||
ModeController_js_1.ModeController,
|
||||
MotionSensor_js_1.MotionSensor,
|
||||
PercentageController_js_1.PercentageController,
|
||||
PlaybackController_js_1.PlaybackController,
|
||||
PlaybackStateReporter_js_1.PlaybackStateReporter,
|
||||
PowerController_js_1.PowerController,
|
||||
PowerLevelController_js_1.PowerLevelController,
|
||||
RangeController_js_1.RangeController,
|
||||
SecurityPanelController_js_1.SecurityPanelController,
|
||||
Speaker_js_1.Speaker,
|
||||
StepSpeaker_js_1.StepSpeaker,
|
||||
TemperatureSensor_js_1.TemperatureSensor,
|
||||
ThermostatController_js_1.ThermostatController,
|
||||
ThermostatControllerSchedule_js_1.ThermostatControllerSchedule,
|
||||
|
|
@ -101,6 +122,8 @@ exports.registry = {
|
|||
return [...descriptors.values()].sort((a, b) => (a.namespace < b.namespace ? -1 : 1));
|
||||
},
|
||||
};
|
||||
var InputController_js_2 = require("./interfaces/InputController.js");
|
||||
Object.defineProperty(exports, "INPUTS", { enumerable: true, get: function () { return InputController_js_2.INPUTS; } });
|
||||
var ThermostatController_js_2 = require("./interfaces/ThermostatController.js");
|
||||
Object.defineProperty(exports, "THERMOSTAT_MODES", { enumerable: true, get: function () { return ThermostatController_js_2.THERMOSTAT_MODES; } });
|
||||
var resources_js_1 = require("./resources.js");
|
||||
|
|
|
|||
43
dist/cjs/registry/interfaces/ChannelController.js
vendored
Normal file
43
dist/cjs/registry/interfaces/ChannelController.js
vendored
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ChannelController = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
// None of the fields is required, a channel has one of them at least
|
||||
const channel = schema_js_1.s.object({
|
||||
/** "256", "13.1" */
|
||||
number: schema_js_1.s.optional(schema_js_1.s.string()),
|
||||
callSign: schema_js_1.s.optional(schema_js_1.s.string()),
|
||||
affiliateCallSign: schema_js_1.s.optional(schema_js_1.s.string()),
|
||||
uri: schema_js_1.s.optional(schema_js_1.s.string()),
|
||||
});
|
||||
/**
|
||||
* The channel of a TV. ChangeChannel names the channel by one or more of number, callSign, affiliateCallSign and
|
||||
* uri, or by channelMetadata.name alone. The lineup of a TV provider is not described: the page folds the discovery
|
||||
* example that has one.
|
||||
*/
|
||||
exports.ChannelController = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.ChannelController",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-channelcontroller.html",
|
||||
kind: "controller",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {
|
||||
channel: { name: "channel", value: channel },
|
||||
},
|
||||
directives: {
|
||||
ChangeChannel: {
|
||||
name: "ChangeChannel",
|
||||
payload: schema_js_1.s.object({
|
||||
channel: schema_js_1.s.optional(channel),
|
||||
channelMetadata: schema_js_1.s.optional(schema_js_1.s.object({ name: schema_js_1.s.optional(schema_js_1.s.string()), image: schema_js_1.s.optional(schema_js_1.s.string()) })),
|
||||
}),
|
||||
},
|
||||
SkipChannels: {
|
||||
name: "SkipChannels",
|
||||
payload: schema_js_1.s.object({ channelCount: schema_js_1.s.number({ integer: true }) }),
|
||||
note: "above 0 up, below 0 down",
|
||||
},
|
||||
},
|
||||
});
|
||||
72
dist/cjs/registry/interfaces/EqualizerController.js
vendored
Normal file
72
dist/cjs/registry/interfaces/EqualizerController.js
vendored
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.EqualizerController = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
const BANDS = ["BASS", "MIDRANGE", "TREBLE"];
|
||||
const MODES = ["MOVIE", "MUSIC", "NIGHT", "SPORT", "TV"];
|
||||
const band = schema_js_1.s.enum(...BANDS);
|
||||
const level = schema_js_1.s.number({ integer: true });
|
||||
/**
|
||||
* The bands of an equalizer, its modes, or both. Discovery lists bands for a device declared with bands and mode
|
||||
* for one declared with modes. A band or a mode the device does not have is answered with INVALID_VALUE.
|
||||
*/
|
||||
exports.EqualizerController = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.EqualizerController",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-equalizercontroller.html",
|
||||
kind: "controller",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {
|
||||
bands: { name: "bands", value: schema_js_1.s.array(schema_js_1.s.object({ name: band, value: level })) },
|
||||
mode: { name: "mode", value: schema_js_1.s.enum(...MODES) },
|
||||
},
|
||||
directives: {
|
||||
SetMode: { name: "SetMode", payload: schema_js_1.s.object({ mode: schema_js_1.s.enum(...MODES) }) },
|
||||
SetBands: { name: "SetBands", payload: schema_js_1.s.object({ bands: schema_js_1.s.array(schema_js_1.s.object({ name: band, value: level }), { min: 1 }) }) },
|
||||
AdjustBands: {
|
||||
name: "AdjustBands",
|
||||
payload: schema_js_1.s.object({
|
||||
bands: schema_js_1.s.array(schema_js_1.s.object({ name: band, levelDelta: schema_js_1.s.optional(level), levelDirection: schema_js_1.s.enum("UP", "DOWN") }), { min: 1 }),
|
||||
}),
|
||||
note: "without levelDelta the band moves by the step the device has for it",
|
||||
},
|
||||
ResetBands: { name: "ResetBands", payload: schema_js_1.s.object({ bands: schema_js_1.s.array(schema_js_1.s.object({ name: band }), { min: 1 }) }) },
|
||||
},
|
||||
options: schema_js_1.s.object({
|
||||
/** The bands of the device and the levels they take. Left out for a device that has modes only. */
|
||||
bands: schema_js_1.s.optional(schema_js_1.s.object({
|
||||
supported: schema_js_1.s.array(band, { min: 1 }),
|
||||
range: schema_js_1.s.object({ minimum: level, maximum: level }, { unknownKeys: "reject" }),
|
||||
}, { unknownKeys: "reject" })),
|
||||
/** Left out for a device that has bands only. */
|
||||
modes: schema_js_1.s.optional(schema_js_1.s.array(schema_js_1.s.enum(...MODES), { min: 1 })),
|
||||
}, { unknownKeys: "reject" }),
|
||||
// A capability declared the 1.x way has neither; check() says so, discovery lists both properties
|
||||
discovery({ options: { bands, modes } }) {
|
||||
if (!bands && !modes)
|
||||
return {};
|
||||
return {
|
||||
supported: [...(bands ? ["bands"] : []), ...(modes ? ["mode"] : [])],
|
||||
configurations: {
|
||||
...(bands && { bands: { supported: bands.supported.map((name) => ({ name })), range: bands.range } }),
|
||||
...(modes && { modes: { supported: modes.map((name) => ({ name })) } }),
|
||||
},
|
||||
};
|
||||
},
|
||||
validate(capability) {
|
||||
const { bands, modes = [] } = capability.options;
|
||||
if (!bands && modes.length === 0)
|
||||
throw new types_js_1.DeclarationError(capability, "needs bands, modes or both: declare what the equalizer has");
|
||||
if (bands && bands.range.maximum <= bands.range.minimum) {
|
||||
throw new types_js_1.DeclarationError(capability, `bands.range.maximum ${bands.range.maximum} is not above bands.range.minimum ${bands.range.minimum}`);
|
||||
}
|
||||
const lists = [bands?.supported ?? [], modes];
|
||||
for (const list of lists) {
|
||||
const twice = list.find((entry, i) => list.indexOf(entry) !== i);
|
||||
if (twice)
|
||||
throw new types_js_1.DeclarationError(capability, `${twice} is listed twice`);
|
||||
}
|
||||
},
|
||||
});
|
||||
49
dist/cjs/registry/interfaces/InputController.js
vendored
Normal file
49
dist/cjs/registry/interfaces/InputController.js
vendored
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.InputController = exports.INPUTS = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
/** alexa-inputcontroller.html, "Input property values". */
|
||||
exports.INPUTS = [
|
||||
"AUX 1", "AUX 2", "AUX 3", "AUX 4", "AUX 5", "AUX 6", "AUX 7", "BLURAY", "CABLE", "CD", "COAX 1", "COAX 2",
|
||||
"COMPOSITE 1", "DVD", "GAME", "HD RADIO", "HDMI 1", "HDMI 2", "HDMI 3", "HDMI 4", "HDMI 5", "HDMI 6", "HDMI 7",
|
||||
"HDMI 8", "HDMI 9", "HDMI 10", "HDMI ARC", "INPUT 1", "INPUT 2", "INPUT 3", "INPUT 4", "INPUT 5", "INPUT 6",
|
||||
"INPUT 7", "INPUT 8", "INPUT 9", "INPUT 10", "IPOD", "LINE 1", "LINE 2", "LINE 3", "LINE 4", "LINE 5", "LINE 6",
|
||||
"LINE 7", "MEDIA PLAYER", "OPTICAL 1", "OPTICAL 2", "PHONO", "PLAYSTATION", "PLAYSTATION 3", "PLAYSTATION 4",
|
||||
"SATELLITE", "SMARTCAST", "TUNER", "TV", "USB DAC", "VIDEO 1", "VIDEO 2", "VIDEO 3", "XBOX",
|
||||
];
|
||||
const input = schema_js_1.s.oneOf(exports.INPUTS, "an input like HDMI 1");
|
||||
/**
|
||||
* The input a TV or a receiver shows. The inputs of the device are on the capability itself, as the discovery
|
||||
* example of the page has them; its table calls them a configuration object.
|
||||
*/
|
||||
exports.InputController = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.InputController",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-inputcontroller.html",
|
||||
kind: "controller",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {
|
||||
input: { name: "input", value: input },
|
||||
},
|
||||
directives: {
|
||||
SelectInput: { name: "SelectInput", payload: schema_js_1.s.object({ input }) },
|
||||
},
|
||||
options: schema_js_1.s.object({
|
||||
/** friendlyNames: what the user calls the input, "Cable" for HDMI 2. */
|
||||
inputs: schema_js_1.s.array(schema_js_1.s.object({ name: input, friendlyNames: schema_js_1.s.optional(schema_js_1.s.array(schema_js_1.s.string({ min: 1 }))) }, { unknownKeys: "reject" }), { min: 1 }),
|
||||
}, { unknownKeys: "reject" }),
|
||||
// A capability declared the 1.x way has no inputs; check() says so
|
||||
discovery: ({ options: { inputs } }) => (inputs ? { topLevel: { inputs } } : {}),
|
||||
validate(capability) {
|
||||
const names = capability.options.inputs.map(({ name }) => name);
|
||||
const called = capability.options.inputs.flatMap(({ friendlyNames = [] }) => friendlyNames);
|
||||
const lists = [names, called];
|
||||
for (const list of lists) {
|
||||
const twice = list.find((entry, i) => list.indexOf(entry) !== i);
|
||||
if (twice)
|
||||
throw new types_js_1.DeclarationError(capability, `${twice} is listed twice, a name stands for one input`);
|
||||
}
|
||||
},
|
||||
});
|
||||
46
dist/cjs/registry/interfaces/PlaybackController.js
vendored
Normal file
46
dist/cjs/registry/interfaces/PlaybackController.js
vendored
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.PlaybackController = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
// In the order of the discovery example
|
||||
const OPERATIONS = ["Play", "Pause", "Stop", "Next", "Previous", "FastForward", "Rewind", "StartOver"];
|
||||
// Alexa sends the operations the capability lists
|
||||
const operation = (name) => ({
|
||||
name,
|
||||
payload: schema_js_1.s.object({}),
|
||||
when: ({ options }) => (options.supportedOperations ?? OPERATIONS).includes(name),
|
||||
});
|
||||
/**
|
||||
* Play, pause and the other buttons of a player. The interface reports nothing: what plays is the playbackState of
|
||||
* Alexa.PlaybackStateReporter, which a Response to these directives has in its context. Errors of a video device go
|
||||
* under Alexa.Video, the others under Alexa.
|
||||
*/
|
||||
exports.PlaybackController = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.PlaybackController",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-playbackcontroller.html",
|
||||
kind: "controller",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {},
|
||||
directives: {
|
||||
Play: operation("Play"),
|
||||
Pause: operation("Pause"),
|
||||
Stop: operation("Stop"),
|
||||
Next: operation("Next"),
|
||||
Previous: operation("Previous"),
|
||||
FastForward: operation("FastForward"),
|
||||
Rewind: operation("Rewind"),
|
||||
StartOver: operation("StartOver"),
|
||||
},
|
||||
options: schema_js_1.s.object({
|
||||
/** Default: all eight. */
|
||||
supportedOperations: schema_js_1.s.optional(schema_js_1.s.array(schema_js_1.s.enum(...OPERATIONS), { min: 1 })),
|
||||
}, { unknownKeys: "reject" }),
|
||||
// The example has a properties object without fields, which topLevel puts where properties: false left none
|
||||
discovery: ({ options: { supportedOperations = [...OPERATIONS] } }) => ({
|
||||
properties: false,
|
||||
topLevel: { properties: {}, supportedOperations },
|
||||
}),
|
||||
});
|
||||
18
dist/cjs/registry/interfaces/PlaybackStateReporter.js
vendored
Normal file
18
dist/cjs/registry/interfaces/PlaybackStateReporter.js
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.PlaybackStateReporter = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
/** What a player is doing, for an endpoint with Alexa.PlaybackController. Documented on the page of that interface. */
|
||||
exports.PlaybackStateReporter = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.PlaybackStateReporter",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-playbackcontroller.html",
|
||||
kind: "sensor",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {
|
||||
playbackState: { name: "playbackState", value: schema_js_1.s.object({ state: schema_js_1.s.enum("PLAYING", "PAUSED", "STOPPED") }) },
|
||||
},
|
||||
directives: {},
|
||||
});
|
||||
27
dist/cjs/registry/interfaces/Speaker.js
vendored
Normal file
27
dist/cjs/registry/interfaces/Speaker.js
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Speaker = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
/** A speaker that can be set to a volume from 0 to 100. One that only takes steps is an Alexa.StepSpeaker. */
|
||||
exports.Speaker = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.Speaker",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-speaker.html",
|
||||
kind: "controller",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {
|
||||
volume: { name: "volume", value: schema_js_1.s.number({ min: 0, max: 100, integer: true }) },
|
||||
muted: { name: "muted", value: schema_js_1.s.boolean() },
|
||||
},
|
||||
directives: {
|
||||
SetVolume: { name: "SetVolume", payload: schema_js_1.s.object({ volume: schema_js_1.s.number({ min: 0, max: 100, integer: true }) }) },
|
||||
AdjustVolume: {
|
||||
name: "AdjustVolume",
|
||||
payload: schema_js_1.s.object({ volume: schema_js_1.s.number({ min: -100, max: 100, integer: true }), volumeDefault: schema_js_1.s.boolean() }),
|
||||
note: "volume is the change. volumeDefault is true when the user named no amount",
|
||||
},
|
||||
SetMute: { name: "SetMute", payload: schema_js_1.s.object({ mute: schema_js_1.s.boolean() }) },
|
||||
},
|
||||
});
|
||||
27
dist/cjs/registry/interfaces/StepSpeaker.js
vendored
Normal file
27
dist/cjs/registry/interfaces/StepSpeaker.js
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.StepSpeaker = void 0;
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const types_js_1 = require("../types.js");
|
||||
/**
|
||||
* A speaker that is turned up and down by steps and does not know its volume. It reports nothing: the capability
|
||||
* has no properties object in discovery.
|
||||
*/
|
||||
exports.StepSpeaker = (0, types_js_1.defineInterface)({
|
||||
namespace: "Alexa.StepSpeaker",
|
||||
version: "3",
|
||||
doc: "https://developer.amazon.com/docs/alexaplus/device-apis/alexa-stepspeaker.html",
|
||||
kind: "controller",
|
||||
tier: 2,
|
||||
instanced: false,
|
||||
properties: {},
|
||||
directives: {
|
||||
AdjustVolume: {
|
||||
name: "AdjustVolume",
|
||||
payload: schema_js_1.s.object({ volumeSteps: schema_js_1.s.number({ min: -100, max: 100, integer: true }) }),
|
||||
note: "above 0 louder, below 0 quieter",
|
||||
},
|
||||
SetMute: { name: "SetMute", payload: schema_js_1.s.object({ mute: schema_js_1.s.boolean() }) },
|
||||
},
|
||||
discovery: () => ({ properties: false }),
|
||||
});
|
||||
9
dist/cjs/registry/interfaces/stubs.js
vendored
9
dist/cjs/registry/interfaces/stubs.js
vendored
|
|
@ -4,7 +4,7 @@ exports.STUBS = void 0;
|
|||
// Interfaces without a descriptor of their own. A stub names the interface with the version and the properties
|
||||
// alex2node 1.5.2 put in discovery, so an endpoint that declares one is announced as before. Nothing about it is
|
||||
// checked, and the version is the one 1.5.2 sent, which is not always the one on the page of the interface
|
||||
// (Alexa.Speaker is "3" there). A row leaves this table when a descriptor is written from that page.
|
||||
// (Alexa.Cooking is "3" there). A row leaves this table when a descriptor is written from that page.
|
||||
const schema_js_1 = require("../schema.js");
|
||||
const DEVICE_APIS = "https://developer.amazon.com/docs/alexaplus/device-apis";
|
||||
const LIST_OF_INTERFACES = `${DEVICE_APIS}/list-of-interfaces.html`;
|
||||
|
|
@ -20,7 +20,6 @@ const TABLE = [
|
|||
// 1.5.2 announced the version "UNKNOWN"; 1.7 is what the list of interfaces gives
|
||||
["Alexa.Camera.LiveViewController", "1.7", [], LIST_OF_INTERFACES],
|
||||
["Alexa.CameraStreamController", "3", [], "alexa-camerastreamcontroller.html"],
|
||||
["Alexa.ChannelController", "3", ["channel"], "alexa-channelcontroller.html"],
|
||||
["Alexa.Commissionable", "1", [], "alexa-commissionable.html"],
|
||||
["Alexa.ConsentManagement.ConsentRequiredReporter", "1", [], "alexa-consentrequiredreporter.html"],
|
||||
["Alexa.Cooking", "1", [], "alexa-cooking.html"],
|
||||
|
|
@ -34,8 +33,6 @@ const TABLE = [
|
|||
["Alexa.DeviceUsage.Estimation", "1", [], "alexa-deviceusage-estimation.html"],
|
||||
["Alexa.DeviceUsage.Meter", "1", [], "alexa-deviceusage-meter.html"],
|
||||
["Alexa.DoorbellEventSource", "3", [], "alexa-doorbelleventsource.html"],
|
||||
["Alexa.EqualizerController", "1", [], "alexa-equalizercontroller.html"],
|
||||
["Alexa.InputController", "3", [], "alexa-inputcontroller.html"],
|
||||
["Alexa.InventoryLevelSensor", "1", [], "alexa-inventorylevelsensor.html"],
|
||||
["Alexa.InventoryLevelUsageSensor", "1", [], "alexa-inventorylevelusagesensor.html"],
|
||||
["Alexa.InventoryUsageSensor", "1", [], "alexa-inventoryusagesensor.html"],
|
||||
|
|
@ -44,8 +41,6 @@ const TABLE = [
|
|||
["Alexa.Media.PlayQueue", "1", [], "alexa-media-playqueue.html"],
|
||||
["Alexa.Media.Playback", "1", [], "alexa-media-playback.html"],
|
||||
["Alexa.Media.Search", "1", [], "alexa-media-search.html"],
|
||||
["Alexa.PlaybackController", "3", [], "alexa-playbackcontroller.html"],
|
||||
["Alexa.PlaybackStateReporter", "1", [], "alexa-playbackcontroller.html"],
|
||||
["Alexa.ProactiveNotificationSource", "1", [], "alexa-proactivenotificationsource.html"],
|
||||
["Alexa.RTCSessionController", "1", [], "alexa-rtcsessioncontroller.html"],
|
||||
["Alexa.RecordController", "3", [], "alexa-recordcontroller.html"],
|
||||
|
|
@ -56,8 +51,6 @@ const TABLE = [
|
|||
["Alexa.SimpleEventSource", "1", [], "alexa-simpleeventsource.html"],
|
||||
["Alexa.SmartVision.ObjectDetectionSensor", "1", [], "alexa-smartvision-objectdetectionsensor.html"],
|
||||
["Alexa.SmartVision.SnapshotProvider", "1", [], "alexa-smartvision-snapshotprovider.html"],
|
||||
["Alexa.Speaker", "1", [], "alexa-speaker.html"],
|
||||
["Alexa.StepSpeaker", "1", [], "alexa-stepspeaker.html"],
|
||||
["Alexa.ThermostatController.Configuration", "1", [], "alexa-thermostatcontroller-configuration.html"],
|
||||
["Alexa.ThermostatController.HVAC.Components", "1", [], "alexa-thermostatcontroller-hvac-components.html"],
|
||||
// "UNKNOWN" in 1.5.2 as well; the page is titled "Interface 3"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue