registry: SecurityPanelController with Arm.Response and its errors

Alexa.SecurityPanelController is described from its page: version 3 (the stub of 1.5.2 said 1), armState and the
four alarms, Arm and Disarm. ctx.respond() answers Arm with Arm.Response under the namespace of the interface,
its payload checked (exitDelayInSeconds 0 to 255, bypassedEndpoints), and Disarm with a Response. A Disarm
carries the PIN the user said when the panel is declared with supportedAuthorizationTypes; the handler checks
it and answers UNAUTHORIZED, which goes under Alexa.SecurityPanelController like the five other error types.

A panel declared without options lists armState, where 1.5.2 listed no property; alarms are declared.
17 examples of the two pages are saved as fixtures. 215 tests pass, 207 before.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
David 2026-09-28 20:50:57 +00:00
parent f555a5df70
commit c59cf3ff10
39 changed files with 1248 additions and 23 deletions

View file

@ -48,14 +48,15 @@ for (const { namespace, page, declared, unfit = [], chosen = false, folded = []
}
}
const directives = examples(page, ".directive").map((name) => doc(page, name).directive);
// A page also shows the directives of the interface it is paired with: TurnOn on the page of WakeOnLANController
const directives = examples(page, ".directive").map((name) => doc(page, name).directive)
.filter((directive) => directive.header.namespace === namespace);
assert.deepEqual(
[...new Set(directives.map((directive) => directive.header.name))].sort(),
Object.keys(descriptor.directives).filter((name) => name !== "ReportState" && !folded.includes(name)).sort(),
"the page has an example of every directive"
);
for (const { header, payload } of directives) {
assert.equal(header.namespace, namespace);
assert.deepEqual(descriptor.directives[header.name].payload.parse(payload, "payload"), payload);
}
@ -135,8 +136,10 @@ test("every AlexaInterfaceType is in the registry: described, or a stub with the
});
test("AlexaInterface.getVersion() and getProps() read the registry", () => {
// What a thermostat lists is for its declaration to say: a 1.x declaration lists what 1.5.2 listed
// What a thermostat or a security panel lists is for its declaration to say: a 1.x declaration of the thermostat
// lists what 1.5.2 listed, one of the panel the arm state and no alarm
const chosen = {
"Alexa.SecurityPanelController": ["armState"],
"Alexa.ThermostatController": ["targetSetpoint", "lowerSetpoint", "upperSetpoint", "thermostatMode"],
"Alexa.ThermostatController.Schedule": ["scheduleEnabled"],
};