iobroker.iot 4.1.2 → 4.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +5 -3
  2. package/admin/assets/{index-6Itc0U48.js → index-CyfkYMpa.js} +85 -85
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{index-208Qrr3S.js → index-DBQ_ihVx.js} +83 -83
  5. package/admin/rules/customRuleBlocks.js +2 -2
  6. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js +7 -0
  7. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -1
  8. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +3 -1
  9. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -1
  10. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.js +38 -0
  11. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.js.map +1 -0
  12. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +2 -0
  13. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -1
  14. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -1
  15. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +67 -14
  16. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -1
  17. package/build/lib/AlexaSmartHomeV3/Controls/Button.js +74 -0
  18. package/build/lib/AlexaSmartHomeV3/Controls/Button.js.map +1 -0
  19. package/build/lib/AlexaSmartHomeV3/Controls/Control.js +2 -0
  20. package/build/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -1
  21. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js +1 -7
  22. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -1
  23. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js +8 -5
  24. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -1
  25. package/build/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -1
  26. package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js +200 -0
  27. package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js.map +1 -0
  28. package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js +210 -0
  29. package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js.map +1 -0
  30. package/build/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -1
  31. package/build/lib/AlexaSmartHomeV3/Controls/index.js +15 -3
  32. package/build/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -1
  33. package/build/lib/AlexaSmartHomeV3/DeviceManager.js +9 -2
  34. package/build/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -1
  35. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js +287 -0
  36. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -1
  37. package/build/lib/alexaCustom.js +1 -1
  38. package/build/lib/alexaCustom.js.map +1 -1
  39. package/io-package.json +14 -14
  40. package/package.json +4 -1
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./assets/index-208Qrr3S.js","./assets/ActionVisu__loadShare__react__loadShare__-BKaC-p5K.js","./assets/_commonjsHelpers-Cpj98o6Y.js","./assets/ActionVisu__mf_v__runtimeInit__mf_v__-DtUoI3FU.js","./assets/ActionVisu__loadShare__react_mf_2_dom__loadShare__-Bs1o8DtQ.js","./assets/index-Do-nCdWy.js","./assets/index-DjPMvPni.js"])))=>i.map(i=>d[i]);
2
- import{i as m,A as p}from"./assets/ActionVisu__mf_v__runtimeInit__mf_v__-DtUoI3FU.js";import s from"./assets/virtualExposes-O8-92o9I.js";import{_ as n}from"./assets/preload-helper-BDBacUwf.js";const i={"@iobroker/adapter-react-v5":async()=>await n(()=>import("./assets/index-208Qrr3S.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),react:async()=>await n(()=>import("./assets/index-Do-nCdWy.js").then(t=>t.i),__vite__mapDeps([5,2]),import.meta.url),"react-dom":async()=>await n(()=>import("./assets/index-DjPMvPni.js").then(t=>t.i),__vite__mapDeps([6,2,1,3]),import.meta.url)},a={"@iobroker/adapter-react-v5":{name:"@iobroker/adapter-react-v5",version:"7.7.3",scope:["default"],loaded:!1,from:"ActionVisu",async get(){a["@iobroker/adapter-react-v5"].loaded=!0;const{"@iobroker/adapter-react-v5":e}=i,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},react:{name:"react",version:"18.3.1",scope:["default"],loaded:!1,from:"ActionVisu",async get(){a.react.loaded=!0;const{react:e}=i,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"react-dom":{name:"react-dom",version:"18.3.1",scope:["default"],loaded:!1,from:"ActionVisu",async get(){a["react-dom"].loaded=!0;const{"react-dom":e}=i,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}}},f=[],u={},c="default",d="ActionVisu";async function k(e={},t=[]){const r=m({name:d,remotes:f,shared:a,plugins:[],shareStrategy:"version-first"});var o=u[c];if(o||(o=u[c]={from:d}),!(t.indexOf(o)>=0)){t.push(o),r.initShareScopeMap("default",e);try{await Promise.all(await r.initializeSharing("default",{strategy:"version-first",from:"build",initScope:t}))}catch(l){console.error(l)}return p.initResolve(r),r}}function y(e){if(!(e in s))throw new Error(`Module ${e} does not exist in container.`);return s[e]().then(t=>()=>t)}export{y as get,k as init};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./assets/index-DBQ_ihVx.js","./assets/ActionVisu__loadShare__react__loadShare__-BKaC-p5K.js","./assets/_commonjsHelpers-Cpj98o6Y.js","./assets/ActionVisu__mf_v__runtimeInit__mf_v__-DtUoI3FU.js","./assets/ActionVisu__loadShare__react_mf_2_dom__loadShare__-Bs1o8DtQ.js","./assets/index-Do-nCdWy.js","./assets/index-DjPMvPni.js"])))=>i.map(i=>d[i]);
2
+ import{i as m,A as p}from"./assets/ActionVisu__mf_v__runtimeInit__mf_v__-DtUoI3FU.js";import s from"./assets/virtualExposes-O8-92o9I.js";import{_ as n}from"./assets/preload-helper-BDBacUwf.js";const i={"@iobroker/adapter-react-v5":async()=>await n(()=>import("./assets/index-DBQ_ihVx.js"),__vite__mapDeps([0,1,2,3,4]),import.meta.url),react:async()=>await n(()=>import("./assets/index-Do-nCdWy.js").then(t=>t.i),__vite__mapDeps([5,2]),import.meta.url),"react-dom":async()=>await n(()=>import("./assets/index-DjPMvPni.js").then(t=>t.i),__vite__mapDeps([6,2,1,3]),import.meta.url)},a={"@iobroker/adapter-react-v5":{name:"@iobroker/adapter-react-v5",version:"7.7.3",scope:["default"],loaded:!1,from:"ActionVisu",async get(){a["@iobroker/adapter-react-v5"].loaded=!0;const{"@iobroker/adapter-react-v5":e}=i,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},react:{name:"react",version:"18.3.1",scope:["default"],loaded:!1,from:"ActionVisu",async get(){a.react.loaded=!0;const{react:e}=i,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}},"react-dom":{name:"react-dom",version:"18.3.1",scope:["default"],loaded:!1,from:"ActionVisu",async get(){a["react-dom"].loaded=!0;const{"react-dom":e}=i,r={...await e()};return Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),function(){return r}},shareConfig:{singleton:!0,requiredVersion:"*"}}},f=[],u={},c="default",d="ActionVisu";async function k(e={},t=[]){const r=m({name:d,remotes:f,shared:a,plugins:[],shareStrategy:"version-first"});var o=u[c];if(o||(o=u[c]={from:d}),!(t.indexOf(o)>=0)){t.push(o),r.initShareScopeMap("default",e);try{await Promise.all(await r.initializeSharing("default",{strategy:"version-first",from:"build",initScope:t}))}catch(l){console.error(l)}return p.initResolve(r),r}}function y(e){if(!(e in s))throw new Error(`Module ${e} does not exist in container.`);return s[e]().then(t=>()=>t)}export{y as get,k as init};
@@ -248,6 +248,7 @@ class AlexaResponse {
248
248
  configuration: Utils.defaultIfNullOrEmpty(opts.configuration, undefined),
249
249
  semantics: Utils.defaultIfNullOrEmpty(opts.semantics, undefined),
250
250
  capabilityResources: Utils.defaultIfNullOrEmpty(opts.capabilityResources, undefined),
251
+ supportsDeactivation: Utils.defaultIfNullOrEmpty(opts.supportsDeactivation, undefined),
251
252
  };
252
253
  if (!response.instance) {
253
254
  delete response.instance;
@@ -261,6 +262,12 @@ class AlexaResponse {
261
262
  if (!response.capabilityResources) {
262
263
  delete response.capabilityResources;
263
264
  }
265
+ if (response.supportsDeactivation === undefined) {
266
+ delete response.supportsDeactivation;
267
+ }
268
+ if (response.properties && !Object.keys(response.properties).length) {
269
+ delete response.properties;
270
+ }
264
271
  return response;
265
272
  }
266
273
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AlexaResponse.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport * as Utils from '../Helpers/Utils';\nimport type {\n AlexaV3Capability,\n AlexaV3ContextProperty,\n AlexaV3Directive,\n AlexaV3DirectiveType,\n AlexaV3DiscoverAppliance,\n AlexaV3EndpointID,\n AlexaV3Namespace,\n AlexaV3Payload,\n AlexaV3ReportedState,\n AlexaV3Request,\n} from '../types';\n\n/**\n * Helper class to generate an AlexaResponse.\n */\nexport default class AlexaResponse {\n public context?: {\n properties: AlexaV3ReportedState[];\n };\n\n public iobVersion = '1';\n\n public readonly event?: AlexaV3Directive;\n\n static ErrorResponseName: AlexaV3DirectiveType = 'ErrorResponse';\n\n static isErrorResponse(response: AlexaResponse): boolean {\n return response?.event?.header?.name === AlexaResponse.ErrorResponseName;\n }\n\n static errorResponse(messageId: string, payload: any): AlexaResponse {\n return new AlexaResponse({\n name: AlexaResponse.ErrorResponseName,\n payload,\n messageId,\n });\n }\n\n static endpointUnreachable(messageId: string): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'ENDPOINT_UNREACHABLE',\n message: 'Unable to reach endpoint.',\n });\n }\n\n static throttlingException(messageId: string): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'THROTTLING_EXCEPTION',\n message: 'Unable to reach endpoint.',\n });\n }\n\n static directiveNotSupportedByControl(\n controlName: string,\n namespace: AlexaV3Namespace,\n messageId: string,\n payloadVersion: string,\n ): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'INTERNAL_ERROR',\n message: `Control ${controlName} doesn't support the ${namespace} with payloadVersion ${payloadVersion}`,\n });\n }\n\n static directiveNotSupportedByDevice(\n deviceName: string,\n namespace: AlexaV3Namespace,\n messageId: string,\n payloadVersion: string,\n ): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'INTERNAL_ERROR',\n message: `Device ${deviceName} doesn't support the ${namespace} with payloadVersion ${payloadVersion}`,\n });\n }\n\n static nonExistingEndpoint(messageId: string, endpointId: AlexaV3EndpointID | undefined): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'INTERNAL_ERROR',\n message: `No endpoint with id ${endpointId} found`,\n });\n }\n\n /**\n * Composes Alexa respond on a successfully processed Alexa directive to change the capability's value of a device\n */\n static handled(event: AlexaV3Request, propertyName: string, value: any, propertyInstance?: string): AlexaResponse {\n const response = new AlexaResponse({\n correlationToken: event?.directive?.header?.correlationToken,\n token: event?.directive?.endpoint?.scope?.token,\n endpointId: event?.directive?.endpoint?.endpointId,\n messageId: event?.directive?.header?.messageId,\n });\n\n response.addContextProperty({\n namespace: event?.directive?.header?.namespace,\n name: propertyName,\n instance: propertyInstance,\n value,\n });\n\n return response;\n }\n\n /**\n * Constructor for an Alexa Response.\n *\n * @param opts Contains initialization options for the response\n */\n constructor(opts?: {\n context?: {\n properties: AlexaV3ReportedState[];\n };\n namespace?: AlexaV3Namespace;\n name?: AlexaV3DirectiveType;\n messageId?: string;\n correlationToken?: string;\n payloadVersion?: '3';\n token?: string;\n endpointId?: string;\n payload?: AlexaV3Payload;\n changeCauseType?: 'APP_INTERACTION' | 'PHYSICAL_INTERACTION' | 'VOICE_INTERACTION';\n event?: AlexaV3Directive;\n }) {\n opts ||= {};\n\n if (opts.context !== undefined) {\n this.context = Utils.defaultIfNullOrEmpty(opts.context, undefined);\n }\n\n if (opts.event !== undefined) {\n this.event = Utils.defaultIfNullOrEmpty(opts.event, undefined);\n } else {\n this.event = {\n header: {\n namespace: Utils.defaultIfNullOrEmpty<AlexaV3Namespace>(opts.namespace, 'Alexa'),\n name: Utils.defaultIfNullOrEmpty<AlexaV3DirectiveType>(opts.name, 'Response'),\n messageId: Utils.defaultIfNullOrEmpty(opts.messageId, uuidv4()),\n correlationToken: Utils.defaultIfNullOrEmpty(opts.correlationToken, undefined),\n payloadVersion: Utils.defaultIfNullOrEmpty<'3'>(opts.payloadVersion, '3'),\n },\n endpoint: {\n scope: {\n type: 'BearerToken',\n token: Utils.defaultIfNullOrEmpty(opts.token, 'INVALID'),\n },\n endpointId: Utils.defaultIfNullOrEmpty(opts.endpointId, 'INVALID'),\n },\n payload: Utils.defaultIfNullOrEmpty(opts.payload, {}),\n };\n\n if (opts.changeCauseType) {\n this.event.payload.change = {\n cause: {\n type: opts.changeCauseType,\n },\n properties: [],\n };\n }\n }\n\n if (!this.event) {\n throw new Error('Event is not defined');\n }\n\n // No endpoint in an AcceptGrant or Discover request\n if (this.event.header.name === 'AcceptGrant.Response' || this.event.header.name === 'Discover.Response') {\n delete this.event.endpoint;\n }\n }\n\n addContext(): void {\n this.context ||= { properties: [] };\n }\n\n /**\n * Add a property to the context.\n *\n * @param opts Contains options for the property.\n */\n addContextProperty(opts: {\n namespace?: AlexaV3Namespace;\n instance?: string;\n name?: string;\n value?: any;\n timeOfSample?: string;\n uncertaintyInMilliseconds?: number;\n }): void {\n this.addContext();\n\n const property = {\n namespace: Utils.defaultIfNullOrEmpty(opts.namespace, 'Alexa.EndpointHealth'),\n instance: Utils.defaultIfNullOrEmpty(opts.instance, undefined),\n name: Utils.defaultIfNullOrEmpty(opts.name, 'connectivity'),\n value: Utils.defaultIfNullOrEmpty(opts.value, { value: 'OK' }),\n timeOfSample: Utils.defaultIfNullOrEmpty(opts.timeOfSample, new Date().toISOString()),\n uncertaintyInMilliseconds: Utils.defaultIfNullOrEmpty(opts.uncertaintyInMilliseconds, 0),\n };\n\n if (!property.instance) {\n delete property.instance;\n }\n\n this.context!.properties.push(property);\n }\n\n /**\n * Add a property to the payload.\n *\n * @param opts Contains options for the property.\n */\n addPayloadChangeProperty(opts: AlexaV3ContextProperty): void {\n opts ||= {} as AlexaV3ContextProperty;\n\n const property = {\n namespace: Utils.defaultIfNullOrEmpty(opts.namespace, 'Alexa.EndpointHealth'),\n instance: Utils.defaultIfNullOrEmpty(opts.instance, undefined),\n name: Utils.defaultIfNullOrEmpty(opts.name, 'connectivity'),\n value: Utils.defaultIfNullOrEmpty(opts.value, { value: 'OK' }),\n timeOfSample: Utils.defaultIfNullOrEmpty(opts.timeOfSample, new Date().toISOString()),\n uncertaintyInMilliseconds: Utils.defaultIfNullOrEmpty(opts.uncertaintyInMilliseconds, 0),\n };\n\n if (!property.instance) {\n delete property.instance;\n }\n\n if (!this.event) {\n throw new Error('Event is not defined');\n }\n this.event.payload.change ||= { properties: [], cause: { type: 'APP_INTERACTION' } };\n\n this.event.payload.change.properties.push(property);\n }\n\n static alexaCapability(): AlexaV3Capability[] {\n return [\n {\n type: 'AlexaInterface',\n interface: 'Alexa',\n version: '3',\n },\n ];\n }\n\n /**\n * Adds an endpoint to the payload.\n *\n * @param opts Contains options for the endpoint.\n */\n addPayloadEndpoint(opts: AlexaV3DiscoverAppliance): void {\n if (!this.event) {\n throw new Error('Event is not defined');\n }\n\n this.event.payload.endpoints ||= [];\n\n opts ||= {} as AlexaV3DiscoverAppliance;\n\n // construct the proper structure expected for the endpoint\n const endpoint: AlexaV3DiscoverAppliance = {\n endpointId: Utils.defaultIfNullOrEmpty(opts.endpointId, 'dummy-endpoint-001'),\n manufacturerName: Utils.defaultIfNullOrEmpty(opts.manufacturerName, 'ioBroker Group'),\n description: Utils.defaultIfNullOrEmpty(opts.description, 'Device controlled by ioBroker'),\n friendlyName: Utils.defaultIfNullOrEmpty(opts.friendlyName, 'ioBroker Stub Endpoint'),\n displayCategories: Utils.defaultIfNullOrEmpty(opts.displayCategories, ['OTHER']),\n capabilities: AlexaResponse.alexaCapability().concat(\n Utils.defaultIfNullOrEmpty<AlexaV3Capability[]>(opts.capabilities, []),\n ),\n cookie: undefined,\n };\n\n if (Object.prototype.hasOwnProperty.call(opts, 'cookie')) {\n endpoint.cookie = Utils.defaultIfNullOrEmpty<Record<string, string>>(opts.cookie, {});\n }\n\n this.event.payload.endpoints.push(endpoint);\n }\n\n /**\n * Creates a capability for an endpoint within the payload.\n *\n * @param opts Contains options for the endpoint capability.\n */\n asEndpointCapability(opts?: AlexaV3Capability): AlexaV3Capability {\n opts ||= {} as AlexaV3Capability;\n\n const response = {\n type: Utils.defaultIfNullOrEmpty(opts.type, 'AlexaInterface'),\n interface: Utils.defaultIfNullOrEmpty(opts.interface, 'Alexa'),\n version: Utils.defaultIfNullOrEmpty(opts.version, '3'),\n properties: Utils.defaultIfNullOrEmpty<{\n supported: { name: string }[];\n proactivelyReported?: boolean;\n retrievable?: boolean;\n nonControllable?: boolean;\n }>(\n opts.properties,\n {} as {\n supported: { name: string }[];\n proactivelyReported?: boolean;\n retrievable?: boolean;\n nonControllable?: boolean;\n },\n ),\n // not all capabilities have the following ones\n instance: Utils.defaultIfNullOrEmpty(opts.instance, undefined),\n configuration: Utils.defaultIfNullOrEmpty(opts.configuration, undefined),\n semantics: Utils.defaultIfNullOrEmpty(opts.semantics, undefined),\n capabilityResources: Utils.defaultIfNullOrEmpty(opts.capabilityResources, undefined),\n };\n\n if (!response.instance) {\n delete response.instance;\n }\n if (!response.configuration) {\n delete response.configuration;\n }\n if (!response.semantics) {\n delete response.semantics;\n }\n if (!response.capabilityResources) {\n delete response.capabilityResources;\n }\n\n return response;\n }\n\n /**\n * Get the composed Alexa Response.\n */\n get(): AlexaResponse {\n return this;\n }\n}\n"]}
1
+ {"version":3,"file":"AlexaResponse.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport * as Utils from '../Helpers/Utils';\nimport type {\n AlexaV3Capability,\n AlexaV3ContextProperty,\n AlexaV3Directive,\n AlexaV3DirectiveType,\n AlexaV3DiscoverAppliance,\n AlexaV3EndpointID,\n AlexaV3Namespace,\n AlexaV3Payload,\n AlexaV3ReportedState,\n AlexaV3Request,\n} from '../types';\n\n/**\n * Helper class to generate an AlexaResponse.\n */\nexport default class AlexaResponse {\n public context?: {\n properties: AlexaV3ReportedState[];\n };\n\n public iobVersion = '1';\n\n public readonly event?: AlexaV3Directive;\n\n static ErrorResponseName: AlexaV3DirectiveType = 'ErrorResponse';\n\n static isErrorResponse(response: AlexaResponse): boolean {\n return response?.event?.header?.name === AlexaResponse.ErrorResponseName;\n }\n\n static errorResponse(messageId: string, payload: any): AlexaResponse {\n return new AlexaResponse({\n name: AlexaResponse.ErrorResponseName,\n payload,\n messageId,\n });\n }\n\n static endpointUnreachable(messageId: string): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'ENDPOINT_UNREACHABLE',\n message: 'Unable to reach endpoint.',\n });\n }\n\n static throttlingException(messageId: string): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'THROTTLING_EXCEPTION',\n message: 'Unable to reach endpoint.',\n });\n }\n\n static directiveNotSupportedByControl(\n controlName: string,\n namespace: AlexaV3Namespace,\n messageId: string,\n payloadVersion: string,\n ): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'INTERNAL_ERROR',\n message: `Control ${controlName} doesn't support the ${namespace} with payloadVersion ${payloadVersion}`,\n });\n }\n\n static directiveNotSupportedByDevice(\n deviceName: string,\n namespace: AlexaV3Namespace,\n messageId: string,\n payloadVersion: string,\n ): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'INTERNAL_ERROR',\n message: `Device ${deviceName} doesn't support the ${namespace} with payloadVersion ${payloadVersion}`,\n });\n }\n\n static nonExistingEndpoint(messageId: string, endpointId: AlexaV3EndpointID | undefined): AlexaResponse {\n return AlexaResponse.errorResponse(messageId, {\n type: 'INTERNAL_ERROR',\n message: `No endpoint with id ${endpointId} found`,\n });\n }\n\n /**\n * Composes Alexa respond on a successfully processed Alexa directive to change the capability's value of a device\n */\n static handled(event: AlexaV3Request, propertyName: string, value: any, propertyInstance?: string): AlexaResponse {\n const response = new AlexaResponse({\n correlationToken: event?.directive?.header?.correlationToken,\n token: event?.directive?.endpoint?.scope?.token,\n endpointId: event?.directive?.endpoint?.endpointId,\n messageId: event?.directive?.header?.messageId,\n });\n\n response.addContextProperty({\n namespace: event?.directive?.header?.namespace,\n name: propertyName,\n instance: propertyInstance,\n value,\n });\n\n return response;\n }\n\n /**\n * Constructor for an Alexa Response.\n *\n * @param opts Contains initialization options for the response\n */\n constructor(opts?: {\n context?: {\n properties: AlexaV3ReportedState[];\n };\n namespace?: AlexaV3Namespace;\n name?: AlexaV3DirectiveType;\n messageId?: string;\n correlationToken?: string;\n payloadVersion?: '3';\n token?: string;\n endpointId?: string;\n payload?: AlexaV3Payload;\n changeCauseType?: 'APP_INTERACTION' | 'PHYSICAL_INTERACTION' | 'VOICE_INTERACTION';\n event?: AlexaV3Directive;\n }) {\n opts ||= {};\n\n if (opts.context !== undefined) {\n this.context = Utils.defaultIfNullOrEmpty(opts.context, undefined);\n }\n\n if (opts.event !== undefined) {\n this.event = Utils.defaultIfNullOrEmpty(opts.event, undefined);\n } else {\n this.event = {\n header: {\n namespace: Utils.defaultIfNullOrEmpty<AlexaV3Namespace>(opts.namespace, 'Alexa'),\n name: Utils.defaultIfNullOrEmpty<AlexaV3DirectiveType>(opts.name, 'Response'),\n messageId: Utils.defaultIfNullOrEmpty(opts.messageId, uuidv4()),\n correlationToken: Utils.defaultIfNullOrEmpty(opts.correlationToken, undefined),\n payloadVersion: Utils.defaultIfNullOrEmpty<'3'>(opts.payloadVersion, '3'),\n },\n endpoint: {\n scope: {\n type: 'BearerToken',\n token: Utils.defaultIfNullOrEmpty(opts.token, 'INVALID'),\n },\n endpointId: Utils.defaultIfNullOrEmpty(opts.endpointId, 'INVALID'),\n },\n payload: Utils.defaultIfNullOrEmpty(opts.payload, {}),\n };\n\n if (opts.changeCauseType) {\n this.event.payload.change = {\n cause: {\n type: opts.changeCauseType,\n },\n properties: [],\n };\n }\n }\n\n if (!this.event) {\n throw new Error('Event is not defined');\n }\n\n // No endpoint in an AcceptGrant or Discover request\n if (this.event.header.name === 'AcceptGrant.Response' || this.event.header.name === 'Discover.Response') {\n delete this.event.endpoint;\n }\n }\n\n addContext(): void {\n this.context ||= { properties: [] };\n }\n\n /**\n * Add a property to the context.\n *\n * @param opts Contains options for the property.\n */\n addContextProperty(opts: {\n namespace?: AlexaV3Namespace;\n instance?: string;\n name?: string;\n value?: any;\n timeOfSample?: string;\n uncertaintyInMilliseconds?: number;\n }): void {\n this.addContext();\n\n const property = {\n namespace: Utils.defaultIfNullOrEmpty(opts.namespace, 'Alexa.EndpointHealth'),\n instance: Utils.defaultIfNullOrEmpty(opts.instance, undefined),\n name: Utils.defaultIfNullOrEmpty(opts.name, 'connectivity'),\n value: Utils.defaultIfNullOrEmpty(opts.value, { value: 'OK' }),\n timeOfSample: Utils.defaultIfNullOrEmpty(opts.timeOfSample, new Date().toISOString()),\n uncertaintyInMilliseconds: Utils.defaultIfNullOrEmpty(opts.uncertaintyInMilliseconds, 0),\n };\n\n if (!property.instance) {\n delete property.instance;\n }\n\n this.context!.properties.push(property);\n }\n\n /**\n * Add a property to the payload.\n *\n * @param opts Contains options for the property.\n */\n addPayloadChangeProperty(opts: AlexaV3ContextProperty): void {\n opts ||= {} as AlexaV3ContextProperty;\n\n const property = {\n namespace: Utils.defaultIfNullOrEmpty(opts.namespace, 'Alexa.EndpointHealth'),\n instance: Utils.defaultIfNullOrEmpty(opts.instance, undefined),\n name: Utils.defaultIfNullOrEmpty(opts.name, 'connectivity'),\n value: Utils.defaultIfNullOrEmpty(opts.value, { value: 'OK' }),\n timeOfSample: Utils.defaultIfNullOrEmpty(opts.timeOfSample, new Date().toISOString()),\n uncertaintyInMilliseconds: Utils.defaultIfNullOrEmpty(opts.uncertaintyInMilliseconds, 0),\n };\n\n if (!property.instance) {\n delete property.instance;\n }\n\n if (!this.event) {\n throw new Error('Event is not defined');\n }\n this.event.payload.change ||= { properties: [], cause: { type: 'APP_INTERACTION' } };\n\n this.event.payload.change.properties.push(property);\n }\n\n static alexaCapability(): AlexaV3Capability[] {\n return [\n {\n type: 'AlexaInterface',\n interface: 'Alexa',\n version: '3',\n },\n ];\n }\n\n /**\n * Adds an endpoint to the payload.\n *\n * @param opts Contains options for the endpoint.\n */\n addPayloadEndpoint(opts: AlexaV3DiscoverAppliance): void {\n if (!this.event) {\n throw new Error('Event is not defined');\n }\n\n this.event.payload.endpoints ||= [];\n\n opts ||= {} as AlexaV3DiscoverAppliance;\n\n // construct the proper structure expected for the endpoint\n const endpoint: AlexaV3DiscoverAppliance = {\n endpointId: Utils.defaultIfNullOrEmpty(opts.endpointId, 'dummy-endpoint-001'),\n manufacturerName: Utils.defaultIfNullOrEmpty(opts.manufacturerName, 'ioBroker Group'),\n description: Utils.defaultIfNullOrEmpty(opts.description, 'Device controlled by ioBroker'),\n friendlyName: Utils.defaultIfNullOrEmpty(opts.friendlyName, 'ioBroker Stub Endpoint'),\n displayCategories: Utils.defaultIfNullOrEmpty(opts.displayCategories, ['OTHER']),\n capabilities: AlexaResponse.alexaCapability().concat(\n Utils.defaultIfNullOrEmpty<AlexaV3Capability[]>(opts.capabilities, []),\n ),\n cookie: undefined,\n };\n\n if (Object.prototype.hasOwnProperty.call(opts, 'cookie')) {\n endpoint.cookie = Utils.defaultIfNullOrEmpty<Record<string, string>>(opts.cookie, {});\n }\n\n this.event.payload.endpoints.push(endpoint);\n }\n\n /**\n * Creates a capability for an endpoint within the payload.\n *\n * @param opts Contains options for the endpoint capability.\n */\n asEndpointCapability(opts?: AlexaV3Capability): AlexaV3Capability {\n opts ||= {} as AlexaV3Capability;\n\n const response: AlexaV3Capability = {\n type: Utils.defaultIfNullOrEmpty(opts.type, 'AlexaInterface'),\n interface: Utils.defaultIfNullOrEmpty(opts.interface, 'Alexa'),\n version: Utils.defaultIfNullOrEmpty(opts.version, '3'),\n properties: Utils.defaultIfNullOrEmpty<{\n supported: { name: string }[];\n proactivelyReported?: boolean;\n retrievable?: boolean;\n nonControllable?: boolean;\n }>(\n opts.properties,\n {} as {\n supported: { name: string }[];\n proactivelyReported?: boolean;\n retrievable?: boolean;\n nonControllable?: boolean;\n },\n ),\n // not all capabilities have the following ones\n instance: Utils.defaultIfNullOrEmpty(opts.instance, undefined),\n configuration: Utils.defaultIfNullOrEmpty(opts.configuration, undefined),\n semantics: Utils.defaultIfNullOrEmpty(opts.semantics, undefined),\n capabilityResources: Utils.defaultIfNullOrEmpty(opts.capabilityResources, undefined),\n supportsDeactivation: Utils.defaultIfNullOrEmpty(opts.supportsDeactivation, undefined),\n };\n\n if (!response.instance) {\n delete response.instance;\n }\n if (!response.configuration) {\n delete response.configuration;\n }\n if (!response.semantics) {\n delete response.semantics;\n }\n if (!response.capabilityResources) {\n delete response.capabilityResources;\n }\n if (response.supportsDeactivation === undefined) {\n delete response.supportsDeactivation;\n }\n if (response.properties && !Object.keys(response.properties).length) {\n delete response.properties;\n }\n\n return response;\n }\n\n /**\n * Get the composed Alexa Response.\n */\n get(): AlexaResponse {\n return this;\n }\n}\n"]}
@@ -63,7 +63,9 @@ class Base {
63
63
  * Returns whether the smart device proactively reports state changes
64
64
  */
65
65
  get proactivelyReported() {
66
- return true;
66
+ // disable it temporally as active reporting is disabled now as generating too many events
67
+ // return true;
68
+ return false;
67
69
  }
68
70
  /**
69
71
  * Returns whether the smart device handles Alexa ReportState directives
@@ -1 +1 @@
1
- {"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAUhD,MAAsB,IAAI;IACZ,WAAW,CAAmB;IAExC;QACI,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,EAAsB,CAAC;IAChE,CAAC;IAED,WAAW,CAAC,KAAuB;QAC/B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAqB;QACzB,OAAO,CACH,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,SAAS;YACtD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC,OAAO,CAC5D,CAAC;IACN,CAAC;IAED,MAAM,KAAK,SAAS;QAChB,OAAO,SAAS,IAAA,iBAAS,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAsB,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,KAAqB;QAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC;IAClE,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAqB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,IAAI,sBAAsB;QAKtB,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;YACpC,CAAC,CAAC;YACF,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;SAChC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACX,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,OAAO;QACP,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACb,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,sBAAsB;SAC1C,CAAC;IACN,CAAC;IAED,YAAY,CAAC,KAAqB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAsB;QAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC;IACvF,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAqB;QACnC,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC;IAChD,CAAC;CACJ;AAxHD,oBAwHC;AAED,kBAAe,IAAI,CAAC","sourcesContent":["import { className } from '../../Helpers/Utils';\nimport type {\n AlexaV3Capability,\n AlexaV3DirectiveValue,\n AlexaV3EndpointID,\n AlexaV3Namespace,\n AlexaV3Request,\n} from '../../types';\nimport type { Base as PropertiesBase } from '../Properties/Base';\n\nexport abstract class Base {\n protected _properties: PropertiesBase[];\n\n protected constructor() {\n this._properties = [];\n }\n\n get name(): string {\n return `${this.constructor.name}`;\n }\n\n get namespace(): AlexaV3Namespace {\n return `Alexa.${this.constructor.name}` as AlexaV3Namespace;\n }\n\n reportValue(value: number | boolean): any {\n return value;\n }\n\n /**\n * Checks whether the capability instance matches, i.e. can handle the event Alexa sends to the skill\n *\n * @param event Contains the Alexa event.\n */\n matches(event: AlexaV3Request): boolean {\n return (\n event?.directive?.header?.namespace === this.namespace &&\n event?.directive?.header?.payloadVersion === this.version\n );\n }\n\n static get namespace(): AlexaV3Namespace {\n return `Alexa.${className(this.toString())}` as AlexaV3Namespace;\n }\n\n /**\n * Checks whether the capability object matches, i.e., can handle the event Alexa sends to the skill\n *\n * @param event Contains the Alexa event.\n */\n static matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.namespace === this.namespace;\n }\n\n get properties(): PropertiesBase[] {\n return this._properties;\n }\n\n /**\n *\n * @param event Contains the Alexa event.\n * @returns Property to handle on Alexa directive\n */\n property(event: AlexaV3Request): PropertiesBase | undefined {\n return this.properties.find(p => p.matches(event));\n }\n\n /**\n * Returns object containing all the properties of the smart device capability as it expected by Alexa during discovery\n */\n get discoverableProperties(): {\n supported: { name: string }[];\n proactivelyReported: boolean;\n retrievable: boolean;\n } {\n return {\n supported: this.properties.map(p => {\n return { name: p.propertyName };\n }),\n proactivelyReported: this.proactivelyReported,\n retrievable: this.retrievable,\n };\n }\n\n /**\n * Returns whether the smart device proactively reports state changes\n */\n get proactivelyReported(): boolean {\n return true;\n }\n\n /**\n * Returns whether the smart device handles Alexa ReportState directives\n */\n get retrievable(): boolean {\n return true;\n }\n\n get version(): string {\n return '3';\n }\n\n /**\n * Returns response to Alexa Discovery directive\n */\n get alexaResponse(): AlexaV3Capability {\n return {\n interface: this.namespace,\n version: this.version,\n properties: this.discoverableProperties,\n };\n }\n\n propertyName(event: AlexaV3Request): string | undefined {\n return this.property(event)?.propertyName;\n }\n\n /**\n * Extracts value to be set on the smart device sent in an Alexa directive\n */\n alexaValue(_event: AlexaV3Request): AlexaV3DirectiveValue {\n throw new Error(`Method alexaValue is not implemented in ${this.name} capability`);\n }\n\n /**\n * Extracts endpoint id sent in an Alexa directive\n */\n static endpointId(event: AlexaV3Request): AlexaV3EndpointID | undefined {\n return event.directive.endpoint?.endpointId;\n }\n}\n\nexport default Base;\n"]}
1
+ {"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAUhD,MAAsB,IAAI;IACZ,WAAW,CAAmB;IAExC;QACI,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,SAAS,IAAI,CAAC,WAAW,CAAC,IAAI,EAAsB,CAAC;IAChE,CAAC;IAED,WAAW,CAAC,KAAuB;QAC/B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAqB;QACzB,OAAO,CACH,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,SAAS;YACtD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC,OAAO,CAC5D,CAAC;IACN,CAAC;IAED,MAAM,KAAK,SAAS;QAChB,OAAO,SAAS,IAAA,iBAAS,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAsB,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,KAAqB;QAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC;IAClE,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAqB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,IAAI,sBAAsB;QAKtB,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC/B,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;YACpC,CAAC,CAAC;YACF,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;SAChC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACnB,0FAA0F;QAC1F,eAAe;QACf,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACX,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,OAAO;QACP,OAAO,GAAG,CAAC;IACf,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACb,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,sBAAsB;SAC1C,CAAC;IACN,CAAC;IAED,YAAY,CAAC,KAAqB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAsB;QAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,IAAI,aAAa,CAAC,CAAC;IACvF,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAqB;QACnC,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC;IAChD,CAAC;CACJ;AA1HD,oBA0HC;AAED,kBAAe,IAAI,CAAC","sourcesContent":["import { className } from '../../Helpers/Utils';\nimport type {\n AlexaV3Capability,\n AlexaV3DirectiveValue,\n AlexaV3EndpointID,\n AlexaV3Namespace,\n AlexaV3Request,\n} from '../../types';\nimport type { Base as PropertiesBase } from '../Properties/Base';\n\nexport abstract class Base {\n protected _properties: PropertiesBase[];\n\n protected constructor() {\n this._properties = [];\n }\n\n get name(): string {\n return `${this.constructor.name}`;\n }\n\n get namespace(): AlexaV3Namespace {\n return `Alexa.${this.constructor.name}` as AlexaV3Namespace;\n }\n\n reportValue(value: number | boolean): any {\n return value;\n }\n\n /**\n * Checks whether the capability instance matches, i.e. can handle the event Alexa sends to the skill\n *\n * @param event Contains the Alexa event.\n */\n matches(event: AlexaV3Request): boolean {\n return (\n event?.directive?.header?.namespace === this.namespace &&\n event?.directive?.header?.payloadVersion === this.version\n );\n }\n\n static get namespace(): AlexaV3Namespace {\n return `Alexa.${className(this.toString())}` as AlexaV3Namespace;\n }\n\n /**\n * Checks whether the capability object matches, i.e., can handle the event Alexa sends to the skill\n *\n * @param event Contains the Alexa event.\n */\n static matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.namespace === this.namespace;\n }\n\n get properties(): PropertiesBase[] {\n return this._properties;\n }\n\n /**\n *\n * @param event Contains the Alexa event.\n * @returns Property to handle on Alexa directive\n */\n property(event: AlexaV3Request): PropertiesBase | undefined {\n return this.properties.find(p => p.matches(event));\n }\n\n /**\n * Returns object containing all the properties of the smart device capability as it expected by Alexa during discovery\n */\n get discoverableProperties(): {\n supported: { name: string }[];\n proactivelyReported: boolean;\n retrievable: boolean;\n } {\n return {\n supported: this.properties.map(p => {\n return { name: p.propertyName };\n }),\n proactivelyReported: this.proactivelyReported,\n retrievable: this.retrievable,\n };\n }\n\n /**\n * Returns whether the smart device proactively reports state changes\n */\n get proactivelyReported(): boolean {\n // disable it temporally as active reporting is disabled now as generating too many events\n // return true;\n return false;\n }\n\n /**\n * Returns whether the smart device handles Alexa ReportState directives\n */\n get retrievable(): boolean {\n return true;\n }\n\n get version(): string {\n return '3';\n }\n\n /**\n * Returns response to Alexa Discovery directive\n */\n get alexaResponse(): AlexaV3Capability {\n return {\n interface: this.namespace,\n version: this.version,\n properties: this.discoverableProperties,\n };\n }\n\n propertyName(event: AlexaV3Request): string | undefined {\n return this.property(event)?.propertyName;\n }\n\n /**\n * Extracts value to be set on the smart device sent in an Alexa directive\n */\n alexaValue(_event: AlexaV3Request): AlexaV3DirectiveValue {\n throw new Error(`Method alexaValue is not implemented in ${this.name} capability`);\n }\n\n /**\n * Extracts endpoint id sent in an Alexa directive\n */\n static endpointId(event: AlexaV3Request): AlexaV3EndpointID | undefined {\n return event.directive.endpoint?.endpointId;\n }\n}\n\nexport default Base;\n"]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const Base_1 = __importDefault(require("./Base"));
7
+ class SceneController extends Base_1.default {
8
+ constructor() {
9
+ super();
10
+ // SceneController doesn't have properties
11
+ this._properties = [];
12
+ }
13
+ /**
14
+ * Scenes don't report state proactively
15
+ */
16
+ get proactivelyReported() {
17
+ return false;
18
+ }
19
+ /**
20
+ * Scenes don't support ReportState
21
+ */
22
+ get retrievable() {
23
+ return false;
24
+ }
25
+ /**
26
+ * Override alexaResponse to not include properties since SceneController doesn't have any
27
+ */
28
+ get alexaResponse() {
29
+ return {
30
+ interface: this.namespace,
31
+ version: this.version,
32
+ type: 'AlexaInterface',
33
+ supportsDeactivation: false,
34
+ };
35
+ }
36
+ }
37
+ exports.default = SceneController;
38
+ //# sourceMappingURL=SceneController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SceneController.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAG1B,MAAqB,eAAgB,SAAQ,cAAI;IAC7C;QACI,KAAK,EAAE,CAAC;QACR,0CAA0C;QAC1C,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACnB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACX,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,IAAI,aAAa;QACb,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,gBAAgB;YACtB,oBAAoB,EAAE,KAAK;SAC9B,CAAC;IACN,CAAC;CACJ;AAhCD,kCAgCC","sourcesContent":["import Base from './Base';\nimport type { AlexaV3Capability } from '../../types';\n\nexport default class SceneController extends Base {\n constructor() {\n super();\n // SceneController doesn't have properties\n this._properties = [];\n }\n\n /**\n * Scenes don't report state proactively\n */\n get proactivelyReported(): boolean {\n return false;\n }\n\n /**\n * Scenes don't support ReportState\n */\n get retrievable(): boolean {\n return false;\n }\n\n /**\n * Override alexaResponse to not include properties since SceneController doesn't have any\n */\n get alexaResponse(): AlexaV3Capability {\n return {\n interface: this.namespace,\n version: this.version,\n type: 'AlexaInterface',\n supportsDeactivation: false,\n };\n }\n}\n"]}
@@ -12,6 +12,7 @@ const ModeController_1 = __importDefault(require("./ModeController"));
12
12
  const MotionSensor_1 = __importDefault(require("./MotionSensor"));
13
13
  const PercentageController_1 = __importDefault(require("./PercentageController"));
14
14
  const PowerController_1 = __importDefault(require("./PowerController"));
15
+ const SceneController_1 = __importDefault(require("./SceneController"));
15
16
  const Speaker_1 = __importDefault(require("./Speaker"));
16
17
  const TemperatureSensor_1 = __importDefault(require("./TemperatureSensor"));
17
18
  const ThermostatController_1 = __importDefault(require("./ThermostatController"));
@@ -25,6 +26,7 @@ exports.default = {
25
26
  MotionSensor: MotionSensor_1.default,
26
27
  PercentageController: PercentageController_1.default,
27
28
  PowerController: PowerController_1.default,
29
+ SceneController: SceneController_1.default,
28
30
  Speaker: Speaker_1.default,
29
31
  TemperatureSensor: TemperatureSensor_1.default,
30
32
  ThermostatController: ThermostatController_1.default,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.ts"],"names":[],"mappings":";;;;;AAAA,kFAA0D;AAC1D,wEAAgD;AAChD,8FAAsE;AACtE,oEAA4C;AAC5C,sEAA8C;AAC9C,sEAA8C;AAC9C,kEAA0C;AAC1C,kFAA0D;AAC1D,wEAAgD;AAChD,wDAAgC;AAChC,4EAAoD;AACpD,kFAA0D;AAE1D,kBAAe;IACX,oBAAoB,EAApB,8BAAoB;IACpB,eAAe,EAAf,yBAAe;IACf,0BAA0B,EAA1B,oCAA0B;IAC1B,aAAa,EAAb,uBAAa;IACb,cAAc,EAAd,wBAAc;IACd,cAAc,EAAd,wBAAc;IACd,YAAY,EAAZ,sBAAY;IACZ,oBAAoB,EAApB,8BAAoB;IACpB,eAAe,EAAf,yBAAe;IACf,OAAO,EAAP,iBAAO;IACP,iBAAiB,EAAjB,2BAAiB;IACjB,oBAAoB,EAApB,8BAAoB;CACvB,CAAC","sourcesContent":["import BrightnessController from './BrightnessController';\nimport ColorController from './ColorController';\nimport ColorTemperatureController from './ColorTemperatureController';\nimport ContactSensor from './ContactSensor';\nimport LockController from './LockController';\nimport ModeController from './ModeController';\nimport MotionSensor from './MotionSensor';\nimport PercentageController from './PercentageController';\nimport PowerController from './PowerController';\nimport Speaker from './Speaker';\nimport TemperatureSensor from './TemperatureSensor';\nimport ThermostatController from './ThermostatController';\n\nexport default {\n BrightnessController,\n ColorController,\n ColorTemperatureController,\n ContactSensor,\n LockController,\n ModeController,\n MotionSensor,\n PercentageController,\n PowerController,\n Speaker,\n TemperatureSensor,\n ThermostatController,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.ts"],"names":[],"mappings":";;;;;AAAA,kFAA0D;AAC1D,wEAAgD;AAChD,8FAAsE;AACtE,oEAA4C;AAC5C,sEAA8C;AAC9C,sEAA8C;AAC9C,kEAA0C;AAC1C,kFAA0D;AAC1D,wEAAgD;AAChD,wEAAgD;AAChD,wDAAgC;AAChC,4EAAoD;AACpD,kFAA0D;AAE1D,kBAAe;IACX,oBAAoB,EAApB,8BAAoB;IACpB,eAAe,EAAf,yBAAe;IACf,0BAA0B,EAA1B,oCAA0B;IAC1B,aAAa,EAAb,uBAAa;IACb,cAAc,EAAd,wBAAc;IACd,cAAc,EAAd,wBAAc;IACd,YAAY,EAAZ,sBAAY;IACZ,oBAAoB,EAApB,8BAAoB;IACpB,eAAe,EAAf,yBAAe;IACf,eAAe,EAAf,yBAAe;IACf,OAAO,EAAP,iBAAO;IACP,iBAAiB,EAAjB,2BAAiB;IACjB,oBAAoB,EAApB,8BAAoB;CACvB,CAAC","sourcesContent":["import BrightnessController from './BrightnessController';\nimport ColorController from './ColorController';\nimport ColorTemperatureController from './ColorTemperatureController';\nimport ContactSensor from './ContactSensor';\nimport LockController from './LockController';\nimport ModeController from './ModeController';\nimport MotionSensor from './MotionSensor';\nimport PercentageController from './PercentageController';\nimport PowerController from './PowerController';\nimport SceneController from './SceneController';\nimport Speaker from './Speaker';\nimport TemperatureSensor from './TemperatureSensor';\nimport ThermostatController from './ThermostatController';\n\nexport default {\n BrightnessController,\n ColorController,\n ColorTemperatureController,\n ContactSensor,\n LockController,\n ModeController,\n MotionSensor,\n PercentageController,\n PowerController,\n SceneController,\n Speaker,\n TemperatureSensor,\n ThermostatController,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/Base.ts"],"names":[],"mappings":"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","sourcesContent":["import { configuredRangeOrDefault, firstLower, className } from '../../Helpers/Utils';\nimport type {\n AlexaV3DirectiveName,\n AlexaV3DirectiveValue,\n AlexaV3Request,\n IotExternalDetectorState,\n} from '../../types';\n\nexport type ControlStateInitObject = {\n setState?: IotExternalDetectorState;\n getState?: IotExternalDetectorState;\n alexaSetter?: (alexaValue: AlexaV3DirectiveValue) => ioBroker.StateValue | undefined;\n alexaGetter?: (value: ioBroker.StateValue | undefined) => AlexaV3DirectiveValue;\n\n // Extra for Color control\n hal?: {\n hue: string;\n saturation?: string;\n brightness?: string;\n };\n\n // Extra for Mode control\n supportedModes?: any[];\n instance?: string;\n};\n\nexport class Base {\n #setState: IotExternalDetectorState | null = null;\n protected _setId: string = '';\n protected _getId: string = '';\n #valuesRange: { min: number | boolean; max: number | boolean } = { min: 0, max: 100 };\n #currentValue: ioBroker.StateValue | undefined;\n protected _alexaSetter?: (value: AlexaV3DirectiveValue) => ioBroker.StateValue | undefined;\n protected _alexaGetter?: (value: ioBroker.StateValue | undefined) => AlexaV3DirectiveValue;\n #instance?: string;\n protected _supportedModesAsEnum: Record<string, number | string> = {};\n\n /**\n * @param opts The object to initialize the corresponding ioBroker state.\n * @param opts.setState The iobroker state to write values to.\n * @param opts.getState The iobroker state to read values from.\n * @param opts.alexaSetter The function to apply to an Alexa value to transform it to the iobroker's one\n * @param opts.alexaGetter The function to apply to an iobroker value to transform it to the Alexa's one\n * @param ignoreStandard If the standard checks should be ignored (used for Color control)\n */\n constructor(opts: ControlStateInitObject, ignoreStandard?: boolean) {\n if (!ignoreStandard) {\n if (!opts.setState) {\n throw new Error(`missing setState in ${this.constructor.name}`);\n }\n this.#setState = opts.setState;\n this._setId = opts.setState.id;\n this._getId = opts.getState?.id || this._setId;\n this.#valuesRange = configuredRangeOrDefault(this.#setState);\n this.#instance = opts.instance;\n }\n\n if (opts.alexaSetter) {\n this._alexaSetter = opts.alexaSetter;\n }\n if (opts.alexaGetter) {\n this._alexaGetter = opts.alexaGetter;\n }\n }\n\n get instance(): string | undefined {\n return this.#instance;\n }\n\n get propertyName(): string {\n return firstLower(`${this.constructor.name}`);\n }\n\n static get propertyName(): string {\n return firstLower(className(this.toString()));\n }\n\n get valuesRangeMin(): number | boolean {\n return this.#valuesRange.min;\n }\n\n get valuesRangeMax(): number | boolean {\n return this.#valuesRange.max;\n }\n\n get setId(): string {\n return this._setId;\n }\n\n get getId(): string {\n return this._getId;\n }\n /**\n * returns last known iobroker value\n */\n get currentValue(): ioBroker.StateValue | undefined {\n return this.#currentValue;\n }\n\n set currentValue(value: ioBroker.StateValue | undefined) {\n this.#currentValue = value;\n }\n\n value(alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n return this._alexaSetter && typeof alexaValue === 'number'\n ? this._alexaSetter(alexaValue)\n : (alexaValue as ioBroker.StateValue | undefined);\n }\n\n alexaValue(value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n return this._alexaGetter && typeof value === 'number'\n ? this._alexaGetter(value)\n : (value as AlexaV3DirectiveValue);\n }\n\n static directive(_event: AlexaV3Request): AlexaV3DirectiveName {\n return Base.SET;\n }\n\n /**\n * Checks whether a directive refers to the property\n *\n * @param event Contains the Alexa event.\n */\n static matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.namespace === `Alexa.${className(this.toString())}Controller`;\n }\n\n matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.name === this.propertyName;\n }\n\n /**\n * Extracts value to be set on the smart device sent in an Alexa directive\n */\n alexaDirectiveValue(event: AlexaV3Request): AlexaV3DirectiveValue {\n if (this.propertyName === 'color') {\n return event.directive.payload.color;\n }\n if (this.propertyName === 'colorTemperatureInKelvin') {\n return event.directive.payload.colorTemperatureInKelvin;\n }\n if (this.propertyName === 'brightness') {\n return event.directive.payload.brightness;\n }\n // @ts-expect-error fix later\n return event.directive.payload[this.propertyName];\n }\n\n reportValue(value: AlexaV3DirectiveValue): any {\n return value;\n }\n\n static get ADJUST(): AlexaV3DirectiveName {\n return 'ADJUST';\n }\n\n static get SET(): AlexaV3DirectiveName {\n return 'SET';\n }\n\n static get CELSIUS_SCALE(): AlexaV3DirectiveName {\n return 'CELSIUS';\n }\n\n get supportedModesAsEnum(): Record<string, number | string> {\n return this._supportedModesAsEnum;\n }\n}\n\nexport default Base;\n"]}
1
+ {"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/Base.ts"],"names":[],"mappings":"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","sourcesContent":["import { configuredRangeOrDefault, firstLower, className } from '../../Helpers/Utils';\nimport type {\n AlexaV3DirectiveName,\n AlexaV3DirectiveValue,\n AlexaV3Request,\n IotExternalDetectorState,\n} from '../../types';\n\nexport type ControlStateInitObject = {\n setState?: IotExternalDetectorState;\n getState?: IotExternalDetectorState;\n alexaSetter?: (alexaValue: AlexaV3DirectiveValue) => ioBroker.StateValue | undefined;\n alexaGetter?: (value: ioBroker.StateValue | undefined) => AlexaV3DirectiveValue;\n\n // Extra for Hue control\n hal?: {\n hue: IotExternalDetectorState;\n saturation?: IotExternalDetectorState;\n brightness?: IotExternalDetectorState;\n };\n\n // Extra for Mode control\n supportedModes?: any[];\n instance?: string;\n\n // Extra for rgb(w) control\n rgbw?:\n | IotExternalDetectorState\n | {\n red: IotExternalDetectorState;\n green: IotExternalDetectorState;\n blue: IotExternalDetectorState;\n white: IotExternalDetectorState;\n };\n rgb?:\n | IotExternalDetectorState\n | {\n red: IotExternalDetectorState;\n green: IotExternalDetectorState;\n blue: IotExternalDetectorState;\n };\n};\n\nexport class Base {\n #setState: IotExternalDetectorState | null = null;\n protected _setId: string = '';\n protected _getId: string = '';\n #valuesRange: { min: number | boolean; max: number | boolean } = { min: 0, max: 100 };\n #currentValue: ioBroker.StateValue | undefined;\n protected _alexaSetter?: (value: AlexaV3DirectiveValue) => ioBroker.StateValue | undefined;\n protected _alexaGetter?: (value: ioBroker.StateValue | undefined) => AlexaV3DirectiveValue;\n #instance?: string;\n protected _supportedModesAsEnum: Record<string, number | string> = {};\n\n /**\n * @param opts The object to initialize the corresponding ioBroker state.\n * @param opts.setState The iobroker state to write values to.\n * @param opts.getState The iobroker state to read values from.\n * @param opts.alexaSetter The function to apply to an Alexa value to transform it to the iobroker's one\n * @param opts.alexaGetter The function to apply to an iobroker value to transform it to the Alexa's one\n * @param ignoreStandard If the standard checks should be ignored (used for Color control)\n */\n constructor(opts: ControlStateInitObject, ignoreStandard?: boolean) {\n if (!ignoreStandard) {\n if (!opts.setState) {\n throw new Error(`missing setState in ${this.constructor.name}`);\n }\n this.#setState = opts.setState;\n this._setId = opts.setState.id;\n this._getId = opts.getState?.id || this._setId;\n this.#valuesRange = configuredRangeOrDefault(this.#setState);\n this.#instance = opts.instance;\n }\n\n if (opts.alexaSetter) {\n this._alexaSetter = opts.alexaSetter;\n }\n if (opts.alexaGetter) {\n this._alexaGetter = opts.alexaGetter;\n }\n }\n\n get instance(): string | undefined {\n return this.#instance;\n }\n\n get propertyName(): string {\n return firstLower(`${this.constructor.name}`);\n }\n\n static get propertyName(): string {\n return firstLower(className(this.toString()));\n }\n\n get valuesRangeMin(): number | boolean {\n return this.#valuesRange.min;\n }\n\n get valuesRangeMax(): number | boolean {\n return this.#valuesRange.max;\n }\n\n get setId(): string {\n return this._setId;\n }\n\n get getId(): string {\n return this._getId;\n }\n /**\n * returns last known iobroker value\n */\n get currentValue(): ioBroker.StateValue | undefined {\n return this.#currentValue;\n }\n\n set currentValue(value: ioBroker.StateValue | undefined) {\n this.#currentValue = value;\n }\n\n value(alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n return this._alexaSetter && typeof alexaValue === 'number'\n ? this._alexaSetter(alexaValue)\n : (alexaValue as ioBroker.StateValue | undefined);\n }\n\n alexaValue(value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n return this._alexaGetter && typeof value === 'number'\n ? this._alexaGetter(value)\n : (value as AlexaV3DirectiveValue);\n }\n\n static directive(_event: AlexaV3Request): AlexaV3DirectiveName {\n return Base.SET;\n }\n\n /**\n * Checks whether a directive refers to the property\n *\n * @param event Contains the Alexa event.\n */\n static matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.namespace === `Alexa.${className(this.toString())}Controller`;\n }\n\n matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.name === this.propertyName;\n }\n\n /**\n * Extracts value to be set on the smart device sent in an Alexa directive\n */\n alexaDirectiveValue(event: AlexaV3Request): AlexaV3DirectiveValue {\n if (this.propertyName === 'color') {\n return event.directive.payload.color;\n }\n if (this.propertyName === 'colorTemperatureInKelvin') {\n return event.directive.payload.colorTemperatureInKelvin;\n }\n if (this.propertyName === 'brightness') {\n return event.directive.payload.brightness;\n }\n // @ts-expect-error fix later\n return event.directive.payload[this.propertyName];\n }\n\n reportValue(value: AlexaV3DirectiveValue): any {\n return value;\n }\n\n static get ADJUST(): AlexaV3DirectiveName {\n return 'ADJUST';\n }\n\n static get SET(): AlexaV3DirectiveName {\n return 'SET';\n }\n\n static get CELSIUS_SCALE(): AlexaV3DirectiveName {\n return 'CELSIUS';\n }\n\n get supportedModesAsEnum(): Record<string, number | string> {\n return this._supportedModesAsEnum;\n }\n}\n\nexport default Base;\n"]}
@@ -4,29 +4,82 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const Base_1 = __importDefault(require("./Base"));
7
+ const Utils_1 = require("../../Helpers/Utils");
7
8
  class Color extends Base_1.default {
8
- _hal = {
9
- hue: '',
10
- saturation: '',
11
- brightness: '',
12
- };
9
+ _hal = undefined;
10
+ _rgbw = undefined;
11
+ _rgb = undefined;
13
12
  constructor(opts) {
14
13
  super(opts, true);
15
- if (!opts.hal) {
16
- throw new Error('Color control requires hal object with hue, saturation, and brightness properties');
14
+ if (!opts?.hal && !opts?.rgbw && !opts?.rgb) {
15
+ throw new Error('Hue control requires hal object with hue, saturation, and brightness properties');
16
+ }
17
+ if (opts?.hal) {
18
+ this._hal = opts.hal;
19
+ this._setId = opts.hal.hue.id;
20
+ this._getId = opts.hal.hue.id;
21
+ }
22
+ else if (opts?.rgbw) {
23
+ this._rgbw = opts.rgbw;
24
+ const rgbObject = this._rgbw;
25
+ if (!rgbObject.red) {
26
+ this._setId = this._rgbw.id;
27
+ this._getId = this._rgbw.id;
28
+ }
29
+ }
30
+ else if (opts?.rgb) {
31
+ this._rgb = opts.rgb;
32
+ const rgbObject = this._rgb;
33
+ if (!rgbObject.red) {
34
+ this._setId = this._rgb.id;
35
+ this._getId = this._rgb.id;
36
+ }
17
37
  }
18
- this.hal = opts.hal;
19
- this._setId = opts.hal.hue;
20
- this._getId = opts.hal.hue;
21
38
  }
22
39
  matches(event) {
23
40
  return Color.matches(event) && event?.directive?.header?.name === 'SetColor';
24
41
  }
25
- set hal(value) {
26
- this._hal = value;
27
- }
42
+ /** Return IDs for HAL */
28
43
  get hal() {
29
- return this._hal;
44
+ if (!this._hal?.hue) {
45
+ return undefined;
46
+ }
47
+ return {
48
+ hue: this._hal.hue.id,
49
+ saturation: this._hal.saturation?.id,
50
+ brightness: this._hal.brightness?.id,
51
+ };
52
+ }
53
+ alexaValue(value) {
54
+ if (typeof value === 'string') {
55
+ // It could be hex color #RRGGBB or #RRGGBBAA or rgb(r,g,b) or rgba(r,g,b,a)
56
+ if (value.startsWith('#')) {
57
+ // If #rrggbbaa
58
+ // if (value.length === 9) {
59
+ // return rgbw2hal(value);
60
+ // }
61
+ return (0, Utils_1.rgb2hal)((0, Utils_1.rgbwToHex)(value).substring(0, 7));
62
+ }
63
+ if (value.startsWith('rgba')) {
64
+ return (0, Utils_1.rgbw2hal)((0, Utils_1.rgbwToHex)(value));
65
+ }
66
+ if (value.startsWith('rgb')) {
67
+ return (0, Utils_1.rgb2hal)((0, Utils_1.rgbwToHex)(value));
68
+ }
69
+ }
70
+ return undefined;
71
+ }
72
+ value(alexaValue) {
73
+ if (typeof alexaValue === 'object' && alexaValue !== null) {
74
+ const hslValue = alexaValue;
75
+ if ('hue' in hslValue && 'saturation' in hslValue) {
76
+ if (this._rgbw) {
77
+ return `${(0, Utils_1.hal2rgb)(hslValue)}ff`;
78
+ }
79
+ return (0, Utils_1.hal2rgb)(hslValue);
80
+ }
81
+ }
82
+ return undefined;
30
83
  }
31
84
  }
32
85
  exports.default = Color;
@@ -1 +1 @@
1
- {"version":3,"file":"Color.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/Color.ts"],"names":[],"mappings":";;;;;AAAA,kDAA2D;AAG3D,MAAqB,KAAM,SAAQ,cAAI;IAC3B,IAAI,GAIR;QACA,GAAG,EAAE,EAAE;QACP,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;KACjB,CAAC;IAEF,YAAY,IAA4B;QACpC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACzG,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,KAAqB;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,KAAK,UAAU,CAAC;IACjF,CAAC;IAED,IAAI,GAAG,CAAC,KAAgE;QACpE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,GAAG;QAKH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;CACJ;AApCD,wBAoCC","sourcesContent":["import Base, { type ControlStateInitObject } from './Base';\nimport type { AlexaV3Request } from '../../types';\n\nexport default class Color extends Base {\n private _hal: {\n hue: string;\n saturation?: string;\n brightness?: string;\n } = {\n hue: '',\n saturation: '',\n brightness: '',\n };\n\n constructor(opts: ControlStateInitObject) {\n super(opts, true);\n if (!opts.hal) {\n throw new Error('Color control requires hal object with hue, saturation, and brightness properties');\n }\n this.hal = opts.hal;\n this._setId = opts.hal.hue;\n this._getId = opts.hal.hue;\n }\n\n matches(event: AlexaV3Request): boolean {\n return Color.matches(event) && event?.directive?.header?.name === 'SetColor';\n }\n\n set hal(value: { hue: string; saturation?: string; brightness?: string }) {\n this._hal = value;\n }\n\n get hal(): {\n hue: string;\n saturation?: string;\n brightness?: string;\n } {\n return this._hal;\n }\n}\n"]}
1
+ {"version":3,"file":"Color.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/Color.ts"],"names":[],"mappings":";;;;;AAAA,kDAA2D;AAE3D,+CAA4E;AAa5E,MAAqB,KAAM,SAAQ,cAAI;IAClB,IAAI,GAMH,SAAS,CAAC;IACX,KAAK,GAAyD,SAAS,CAAC;IACxE,IAAI,GAAwD,SAAS,CAAC;IAEvF,YAAY,IAA4B;QACpC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAsB,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,GAAI,IAAI,CAAC,KAAkC,CAAC,EAAE,CAAC;gBAC1D,IAAI,CAAC,MAAM,GAAI,IAAI,CAAC,KAAkC,CAAC,EAAE,CAAC;YAC9D,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAqB,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,GAAI,IAAI,CAAC,IAAiC,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,MAAM,GAAI,IAAI,CAAC,IAAiC,CAAC,EAAE,CAAC;YAC7D,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAqB;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,KAAK,UAAU,CAAC;IACjF,CAAC;IAED,yBAAyB;IACzB,IAAI,GAAG;QAOH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAClB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO;YACH,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACrB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACpC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;SACvC,CAAC;IACN,CAAC;IAED,UAAU,CAAC,KAAsC;QAO7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,4EAA4E;YAC5E,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,eAAe;gBACf,4BAA4B;gBAC5B,8BAA8B;gBAC9B,IAAI;gBACJ,OAAO,IAAA,eAAO,EAAC,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAA,gBAAQ,EAAC,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAA,eAAO,EAAC,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC,CAAC;YACrC,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAiC;QACnC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,QAAQ,GAAG,UAAqE,CAAC;YACvF,IAAI,KAAK,IAAI,QAAQ,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,OAAO,GAAG,IAAA,eAAO,EAAC,QAAQ,CAAC,IAAI,CAAC;gBACpC,CAAC;gBACD,OAAO,IAAA,eAAO,EAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ;AAjGD,wBAiGC","sourcesContent":["import Base, { type ControlStateInitObject } from './Base';\nimport type { AlexaV3DirectiveValue, AlexaV3Request, IotExternalDetectorState } from '../../types';\nimport { rgb2hal, rgbw2hal, rgbwToHex, hal2rgb } from '../../Helpers/Utils';\n\ninterface DedicatedRGB {\n red: IotExternalDetectorState;\n green: IotExternalDetectorState;\n blue: IotExternalDetectorState;\n white?: IotExternalDetectorState;\n}\n\ninterface DedicatedRGBW extends DedicatedRGB {\n white: IotExternalDetectorState;\n}\n\nexport default class Color extends Base {\n private readonly _hal:\n | {\n hue: IotExternalDetectorState;\n saturation?: IotExternalDetectorState;\n brightness?: IotExternalDetectorState;\n }\n | undefined = undefined;\n private readonly _rgbw: IotExternalDetectorState | DedicatedRGBW | undefined = undefined;\n private readonly _rgb: IotExternalDetectorState | DedicatedRGB | undefined = undefined;\n\n constructor(opts: ControlStateInitObject) {\n super(opts, true);\n if (!opts?.hal && !opts?.rgbw && !opts?.rgb) {\n throw new Error('Hue control requires hal object with hue, saturation, and brightness properties');\n }\n if (opts?.hal) {\n this._hal = opts.hal;\n this._setId = opts.hal.hue.id;\n this._getId = opts.hal.hue.id;\n } else if (opts?.rgbw) {\n this._rgbw = opts.rgbw;\n const rgbObject = this._rgbw as DedicatedRGBW;\n if (!rgbObject.red) {\n this._setId = (this._rgbw as IotExternalDetectorState).id;\n this._getId = (this._rgbw as IotExternalDetectorState).id;\n }\n } else if (opts?.rgb) {\n this._rgb = opts.rgb;\n const rgbObject = this._rgb as DedicatedRGBW;\n if (!rgbObject.red) {\n this._setId = (this._rgb as IotExternalDetectorState).id;\n this._getId = (this._rgb as IotExternalDetectorState).id;\n }\n }\n }\n\n matches(event: AlexaV3Request): boolean {\n return Color.matches(event) && event?.directive?.header?.name === 'SetColor';\n }\n\n /** Return IDs for HAL */\n get hal():\n | {\n hue: string;\n saturation?: string;\n brightness?: string;\n }\n | undefined {\n if (!this._hal?.hue) {\n return undefined;\n }\n return {\n hue: this._hal.hue.id,\n saturation: this._hal.saturation?.id,\n brightness: this._hal.brightness?.id,\n };\n }\n\n alexaValue(value: ioBroker.StateValue | undefined):\n | {\n hue: number;\n saturation: number;\n brightness: number;\n }\n | undefined {\n if (typeof value === 'string') {\n // It could be hex color #RRGGBB or #RRGGBBAA or rgb(r,g,b) or rgba(r,g,b,a)\n if (value.startsWith('#')) {\n // If #rrggbbaa\n // if (value.length === 9) {\n // return rgbw2hal(value);\n // }\n return rgb2hal(rgbwToHex(value).substring(0, 7));\n }\n if (value.startsWith('rgba')) {\n return rgbw2hal(rgbwToHex(value));\n }\n if (value.startsWith('rgb')) {\n return rgb2hal(rgbwToHex(value));\n }\n }\n return undefined;\n }\n\n value(alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n if (typeof alexaValue === 'object' && alexaValue !== null) {\n const hslValue = alexaValue as { hue: number; saturation: number; brightness: number };\n if ('hue' in hslValue && 'saturation' in hslValue) {\n if (this._rgbw) {\n return `${hal2rgb(hslValue)}ff`;\n }\n return hal2rgb(hslValue);\n }\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const SceneController_1 = __importDefault(require("../Alexa/Capabilities/SceneController"));
7
+ const Control_1 = __importDefault(require("./Control"));
8
+ const AlexaResponse_1 = __importDefault(require("../Alexa/AlexaResponse"));
9
+ const AdapterProvider_1 = __importDefault(require("../Helpers/AdapterProvider"));
10
+ class Button extends Control_1.default {
11
+ constructor(detectedControl) {
12
+ super(detectedControl);
13
+ const sceneController = new SceneController_1.default();
14
+ this._supported = [sceneController];
15
+ }
16
+ get categories() {
17
+ return ['SCENE_TRIGGER'];
18
+ }
19
+ /**
20
+ * Scenes use button type from type-detector
21
+ */
22
+ static get type() {
23
+ return 'button';
24
+ }
25
+ /**
26
+ * Override handle to support SceneController.Activate directive
27
+ */
28
+ async handle(event) {
29
+ this.log.debug(`handling Alexa scene activation event`);
30
+ this.log.silly(`${JSON.stringify(event)}`);
31
+ // Check if this is an Activate directive for SceneController
32
+ if (event?.directive?.header?.namespace === 'Alexa.SceneController' &&
33
+ event?.directive?.header?.name === 'Activate') {
34
+ try {
35
+ // Get the SET state (button state)
36
+ const setState = this.states[this.statesMap.set];
37
+ if (!setState?.id) {
38
+ throw new Error('No SET state found for scene');
39
+ }
40
+ // Trigger the scene by setting the button state to true
41
+ await AdapterProvider_1.default.setState(setState.id, true);
42
+ // Return ActivationStarted response
43
+ const response = new AlexaResponse_1.default({
44
+ namespace: 'Alexa.SceneController',
45
+ name: 'ActivationStarted',
46
+ messageId: event.directive.header.messageId,
47
+ correlationToken: event.directive.header.correlationToken,
48
+ payloadVersion: '3',
49
+ token: event.directive.endpoint?.scope?.token,
50
+ endpointId: event.directive.endpoint?.endpointId,
51
+ });
52
+ response.event.payload = {
53
+ cause: {
54
+ type: 'VOICE_INTERACTION',
55
+ },
56
+ timestamp: new Date().toISOString(),
57
+ };
58
+ this.log.debug('Scene activated successfully');
59
+ this.log.silly(`${JSON.stringify(response.get())}`);
60
+ return response.get();
61
+ }
62
+ catch (error) {
63
+ this.log.debug(`${error}`);
64
+ this.log.error('Failed to activate scene');
65
+ // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
66
+ return Promise.reject(AlexaResponse_1.default.endpointUnreachable(event.directive.header.messageId).get());
67
+ }
68
+ }
69
+ // If not an Activate directive, fall back to parent handler
70
+ return super.handle(event);
71
+ }
72
+ }
73
+ exports.default = Button;
74
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/Button.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AlexaV3Category, AlexaV3Request, IotExternalPatternControl } from '../types';\nimport SceneController from '../Alexa/Capabilities/SceneController';\nimport Control from './Control';\nimport AlexaResponse from '../Alexa/AlexaResponse';\nimport AdapterProvider from '../Helpers/AdapterProvider';\n\nexport default class Button extends Control {\n constructor(detectedControl: IotExternalPatternControl) {\n super(detectedControl);\n\n const sceneController = new SceneController();\n this._supported = [sceneController];\n }\n\n get categories(): AlexaV3Category[] {\n return ['SCENE_TRIGGER'];\n }\n\n /**\n * Scenes use button type from type-detector\n */\n static get type(): string {\n return 'button';\n }\n\n /**\n * Override handle to support SceneController.Activate directive\n */\n async handle(event: AlexaV3Request): Promise<AlexaResponse> {\n this.log.debug(`handling Alexa scene activation event`);\n this.log.silly(`${JSON.stringify(event)}`);\n\n // Check if this is an Activate directive for SceneController\n if (\n event?.directive?.header?.namespace === 'Alexa.SceneController' &&\n event?.directive?.header?.name === 'Activate'\n ) {\n try {\n // Get the SET state (button state)\n const setState = this.states[this.statesMap.set];\n if (!setState?.id) {\n throw new Error('No SET state found for scene');\n }\n\n // Trigger the scene by setting the button state to true\n await AdapterProvider.setState(setState.id, true);\n\n // Return ActivationStarted response\n const response = new AlexaResponse({\n namespace: 'Alexa.SceneController',\n name: 'ActivationStarted',\n messageId: event.directive.header.messageId,\n correlationToken: event.directive.header.correlationToken,\n payloadVersion: '3',\n token: event.directive.endpoint?.scope?.token,\n endpointId: event.directive.endpoint?.endpointId,\n });\n response.event!.payload = {\n cause: {\n type: 'VOICE_INTERACTION',\n },\n timestamp: new Date().toISOString(),\n };\n\n this.log.debug('Scene activated successfully');\n this.log.silly(`${JSON.stringify(response.get())}`);\n return response.get();\n } catch (error) {\n this.log.debug(`${error}`);\n this.log.error('Failed to activate scene');\n\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(AlexaResponse.endpointUnreachable(event.directive.header.messageId).get());\n }\n }\n\n // If not an Activate directive, fall back to parent handler\n return super.handle(event);\n }\n}\n"]}
@@ -22,6 +22,8 @@ class Control {
22
22
  'POWER',
23
23
  'MODE',
24
24
  'HUE',
25
+ 'RGB',
26
+ 'RGBW',
25
27
  'DIMMER',
26
28
  'BRIGHTNESS',
27
29
  'SATURATION',