"use strict"; // One entry per interface that is described in full: the page its examples were saved from (test/helpers/fixtures.js) // and declarations that give capability objects of Amazon's discovery examples. // // namespace the interface // page the page of the interface; test/fixtures/alexa-docs// has its examples // declared [{ options, example, page, n }]: device.add(descriptor, options) gives the n-th capability object of // the interface in that discovery example. n counts from 0 and defaults to it, page defaults to the // page of the interface. The pages of RangeController and ModeController fold their discovery // examples away, so they were not saved: the range is taken from an example of the ToggleController // page, and ModeController has none. // refused [[directive, payload, message]]: a payload the directive does not take, and the message of the // INVALID_VALUE that answers it // unfit [[property, value]]: a value the property does not take // // test/registry/descriptors.test.js, test/device/discovery.test.js and test/dispatch/interfaces.test.js run the // entries. The first one fails for a descriptor of tier 1 or 2 that has no entry. const { asset, semantics, text } = require("alex2node"); const reported = { retrievable: true, proactivelyReported: true }; const declared = [{ options: reported, example: "discovery" }]; const inThreeLanguages = (english, spanish, french) => [text(english, "en-US"), text(spanish, "es-MX"), text(french, "fr-CA")]; module.exports = [ { namespace: "Alexa", page: "alexa-interface", declared: [{ options: {}, example: "discovery" }] }, { namespace: "Alexa.BrightnessController", page: "alexa-brightnesscontroller", declared: [{ options: reported, example: "discovery" }] }, { namespace: "Alexa.ColorController", page: "alexa-colorcontroller", declared, refused: [ ["SetColor", { color: { hue: 361, saturation: 1, brightness: 1 } }, "payload.color.hue: expected a number from 0 to 360, got 361"], ["SetColor", { color: "red" }, 'payload.color: expected an object with hue, saturation, brightness, got "red"'], ], unfit: [["color", { hue: 120, saturation: 50, brightness: 1 }], ["color", { hue: 120, saturation: 1 }]], }, { namespace: "Alexa.ColorTemperatureController", page: "alexa-colortemperaturecontroller", declared, refused: [ ["SetColorTemperature", { colorTemperatureInKelvin: 900 }, "payload.colorTemperatureInKelvin: expected an integer from 1000 to 10000, got 900"], ["IncreaseColorTemperature", "a lot", 'payload: expected an object, got "a lot"'], ], unfit: [["colorTemperatureInKelvin", 10001], ["colorTemperatureInKelvin", "warm"]], }, { namespace: "Alexa.ContactSensor", page: "alexa-contactsensor", declared, unfit: [["detectionState", "OPEN"], ["detectionState", true]] }, { namespace: "Alexa.EndpointHealth", page: "alexa-endpointhealth", declared: [{ options: reported, example: "discovery" }] }, { namespace: "Alexa.HumiditySensor", page: "alexa-humiditysensor", declared, unfit: [["relativeHumidity", 45], ["relativeHumidity", { value: 101 }]] }, { namespace: "Alexa.LockController", page: "alexa-lockcontroller", declared, refused: [["Lock", "now", 'payload: expected an object, got "now"']], unfit: [["lockState", "OPEN"], ["lockState", "locked"]], }, { namespace: "Alexa.ModeController", page: "alexa-modecontroller", declared: [] }, { namespace: "Alexa.MotionSensor", page: "alexa-motionsensor", declared, unfit: [["detectionState", "MOTION"], ["detectionState", 1]] }, { namespace: "Alexa.PercentageController", page: "alexa-percentagecontroller", declared, refused: [ ["SetPercentage", { percentage: 101 }, "payload.percentage: expected an integer from 0 to 100, got 101"], ["AdjustPercentage", { percentageDelta: 0.5 }, "payload.percentageDelta: expected an integer from -100 to 100, got 0.5"], ], unfit: [["percentage", -1], ["percentage", 50.5]], }, { namespace: "Alexa.PowerController", page: "alexa-powercontroller", declared: [{ options: reported, example: "discovery" }] }, { namespace: "Alexa.PowerLevelController", page: "alexa-powerlevelcontroller", declared, refused: [ ["SetPowerLevel", { powerLevel: "half" }, 'payload.powerLevel: expected an integer from 0 to 100, got "half"'], ["AdjustPowerLevel", {}, "payload.powerLevelDelta: expected an integer from -100 to 100, got nothing"], ], unfit: [["powerLevel", 101], ["powerLevel", null]], }, { namespace: "Alexa.RangeController", page: "alexa-rangecontroller", declared: [{ page: "alexa-togglecontroller", example: "discovery-range-and-toggle", options: { ...reported, instance: "SampleManufacturer.Fan.Speed", friendlyNames: [asset("Alexa.Setting.FanSpeed"), ...inThreeLanguages("Speed", "Velocidad", "Vitesse")], range: { min: 1, max: 10, precision: 1 }, presets: [ { value: 10, friendlyNames: [ asset("Alexa.Value.Maximum"), asset("Alexa.Value.High"), text("Highest"), text("Fast"), text("Alta", "es-MX"), text("Élevée", "fr-CA"), ], }, { value: 1, friendlyNames: [ asset("Alexa.Value.Minimum"), asset("Alexa.Value.Low"), text("Lowest"), text("Slow"), text("Baja", "es-MX"), text("Faible", "fr-CA"), ], }, ], }, }], }, { namespace: "Alexa.TemperatureSensor", page: "alexa-temperaturesensor", declared: [{ options: reported, example: "discovery" }] }, { namespace: "Alexa.ToggleController", page: "alexa-togglecontroller", declared: [ { example: "discovery-oven", options: { ...reported, nonControllable: false, instance: "Oven.OvenLight", friendlyNames: inThreeLanguages("Oven light", "Luz del horno", "Lumière du four"), }, }, { example: "discovery-oven", n: 1, options: { ...reported, nonControllable: true, instance: "Stovetop.ResidualHeat", friendlyNames: inThreeLanguages("Stovetop is still hot", "Todavía está caliente", "Encore chaude"), }, }, { example: "discovery-semantics", options: { ...reported, instance: "GarbageCan.Lid", friendlyNames: inThreeLanguages("Garbage can lid", "Tapa del bote de basura", "Couvercle de poubelle"), semantics: semantics().action("Close", "TurnOff", {}).action("Open", "TurnOn", {}).state("Closed", "OFF").state("Open", "ON"), }, }, { example: "discovery-range-and-toggle", options: { ...reported, instance: "SampleManufacturer.Fan.Oscillate", friendlyNames: [ asset("Alexa.Setting.Oscillate"), text("Rotate"), text("Rotation"), text("Girar", "es-MX"), text("Rotation", "fr-CA"), ], }, }, ], }, ];