iobroker.iot 5.0.2 → 5.0.6

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.
@@ -21,7 +21,7 @@
21
21
  />
22
22
  <script type="text/javascript" onerror="setTimeout(function(){window.location.reload()}, 5000)" src="./lib/js/socket.io.js"></script>
23
23
  <title>IoT Settings</title>
24
- <script type="module" crossorigin src="./assets/index-CZlHvSGg.js"></script>
24
+ <script type="module" crossorigin src="./assets/index-D9hse2qJ.js"></script>
25
25
  <link rel="stylesheet" crossorigin href="./assets/index-Bd3GtHgn.css">
26
26
  </head>
27
27
  <body>
@@ -13,9 +13,6 @@ class Base {
13
13
  get namespace() {
14
14
  return `Alexa.${this.constructor.name}`;
15
15
  }
16
- reportValue(value) {
17
- return value;
18
- }
19
16
  /**
20
17
  * Checks whether the capability instance matches, i.e. can handle the event Alexa sends to the skill
21
18
  *
@@ -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,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"]}
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;;;;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;AAtHD,oBAsHC;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 /**\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"]}
@@ -66,6 +66,9 @@ class Base {
66
66
  get valuesRangeMax() {
67
67
  return this.#valuesRange.max;
68
68
  }
69
+ get valueRealMax() {
70
+ return this.#setState?.common.max;
71
+ }
69
72
  get valuesRangeStep() {
70
73
  return this.#valuesRange.step;
71
74
  }
@@ -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 multiPurposeProperty?: boolean;\n // If brightness set to non-zero value and power is off, turn the lamp on\n handleSimilarEvents?: boolean;\n // Level below which the dimmer or percent based control means \"off\"\n offValue?: number;\n // Percent value to set the brightness when turning on the device\n onValue?: number | 'stored' | 'omit';\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; step?: number } = { min: 0, max: 100, step: 10 };\n protected _stateType: ioBroker.CommonType | undefined;\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 protected _multiPurposeProperty: boolean = false;\n protected _handleSimilarEvents: boolean = false;\n protected _offValue: number = 30;\n protected _onValueInPercent: number | undefined | 'stored' | 'omit';\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._multiPurposeProperty = !!opts.multiPurposeProperty;\n this._handleSimilarEvents = !!opts.handleSimilarEvents;\n this.#setState = opts.setState;\n this._offValue = opts.offValue || 30;\n this._setId = opts.setState.id;\n this._getId = opts.getState?.id || this._setId;\n this._stateType = opts.setState.common?.type;\n this.#valuesRange = configuredRangeOrDefault(this.#setState);\n this.#instance = opts.instance;\n this._onValueInPercent = opts.onValue;\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 getSetState(): IotExternalDetectorState | null {\n return this.#setState;\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 valuesRangeStep(): number | undefined {\n return this.#valuesRange.step;\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 /** Converts an Alexa value to an ioBroker value */\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 /** Converts an ioBroker value to an Alexa value */\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 if (this.propertyName === 'percentage') {\n return event.directive.payload.percentage;\n }\n if (this.propertyName === 'rangeValue') {\n return event.directive.payload.rangeValue;\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 multiPurposeProperty?: boolean;\n // If brightness set to non-zero value and power is off, turn the lamp on\n handleSimilarEvents?: boolean;\n // Level below which the dimmer or percent based control means \"off\"\n offValue?: number;\n // Percent value to set the brightness when turning on the device\n onValue?: number | 'stored' | 'omit';\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; step?: number } = { min: 0, max: 100, step: 10 };\n protected _stateType: ioBroker.CommonType | undefined;\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 protected _multiPurposeProperty: boolean = false;\n protected _handleSimilarEvents: boolean = false;\n protected _offValue: number = 30;\n protected _onValueInPercent: number | undefined | 'stored' | 'omit';\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._multiPurposeProperty = !!opts.multiPurposeProperty;\n this._handleSimilarEvents = !!opts.handleSimilarEvents;\n this.#setState = opts.setState;\n this._offValue = opts.offValue || 30;\n this._setId = opts.setState.id;\n this._getId = opts.getState?.id || this._setId;\n this._stateType = opts.setState.common?.type;\n this.#valuesRange = configuredRangeOrDefault(this.#setState);\n this.#instance = opts.instance;\n this._onValueInPercent = opts.onValue;\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 getSetState(): IotExternalDetectorState | null {\n return this.#setState;\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 valueRealMax(): number | boolean | undefined {\n return this.#setState?.common.max;\n }\n\n get valuesRangeStep(): number | undefined {\n return this.#valuesRange.step;\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 /** Converts an Alexa value to an ioBroker value */\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 /** Converts an ioBroker value to an Alexa value */\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 if (this.propertyName === 'percentage') {\n return event.directive.payload.percentage;\n }\n if (this.propertyName === 'rangeValue') {\n return event.directive.payload.rangeValue;\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"]}
@@ -67,6 +67,9 @@ class Color extends Base_1.default {
67
67
  return (0, Utils_1.rgb2hal)((0, Utils_1.rgbwToHex)(value));
68
68
  }
69
69
  }
70
+ else if (value && typeof value === 'object' && value.hue !== undefined) {
71
+ return value;
72
+ }
70
73
  return undefined;
71
74
  }
72
75
  value(alexaValue) {
@@ -1 +1 @@
1
- {"version":3,"file":"Color.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/Color.ts"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"file":"Color.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/Color.ts"],"names":[],"mappings":"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","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 } else if (value && typeof value === 'object' && (value as any).hue !== undefined) {\n return value as unknown as { hue: number; saturation: number; brightness: number };\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"]}
@@ -63,7 +63,8 @@ class PowerState extends Base_1.default {
63
63
  alexaValue(value) {
64
64
  if (this._stateType === 'number') {
65
65
  const min = this.valuesRangeMin;
66
- const max = this.valuesRangeMax;
66
+ // In this case, it is important if max is set or not
67
+ const max = this.valueRealMax;
67
68
  if (min === undefined || max === undefined) {
68
69
  return value > 0 ? PowerState.ON : PowerState.OFF;
69
70
  }
@@ -78,7 +79,7 @@ class PowerState extends Base_1.default {
78
79
  value(alexaValue) {
79
80
  if (this._stateType === 'number') {
80
81
  const min = this.valuesRangeMin;
81
- const max = this.valuesRangeMax;
82
+ const max = this.valueRealMax;
82
83
  if (min === undefined || max === undefined) {
83
84
  return alexaValue === PowerState.ON ? 1 : alexaValue === PowerState.OFF ? 0 : undefined;
84
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PowerState.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.ts"],"names":[],"mappings":"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","sourcesContent":["import Base from './Base';\nimport type { AlexaV3DirectiveName, AlexaV3DirectiveValue, AlexaV3Request } from '../../types';\n\nexport default class PowerState extends Base {\n matches(event: AlexaV3Request): boolean {\n const namespace = event?.directive?.header?.namespace;\n const eventName = event?.directive?.header?.name || '';\n return (\n namespace === 'Alexa.PowerController' ||\n ((this._multiPurposeProperty || this._handleSimilarEvents) &&\n namespace === 'Alexa.PercentageController' &&\n !eventName.includes('Adjust')) ||\n ((this._multiPurposeProperty || this._handleSimilarEvents) &&\n namespace === 'Alexa.BrightnessController' &&\n !eventName.includes('Adjust'))\n );\n }\n\n static get ON(): AlexaV3DirectiveName {\n return 'ON';\n }\n\n static get OFF(): AlexaV3DirectiveName {\n return 'OFF';\n }\n\n alexaDirectiveValue(event: AlexaV3Request): AlexaV3DirectiveValue {\n // Case when we are in dimmer or rgb lamp, and it does not have a dedicated power switch\n if (\n this._multiPurposeProperty &&\n !this._handleSimilarEvents &&\n event.directive.header.namespace === 'Alexa.PercentageController'\n ) {\n const percentage = event.directive.payload.percentage as number;\n if (percentage) {\n return PowerState.ON;\n }\n return PowerState.OFF;\n }\n\n if (this._handleSimilarEvents && event.directive.header.namespace === 'Alexa.PercentageController') {\n const percentage = event.directive.payload.percentage as number;\n if (percentage && !this.currentValue) {\n return PowerState.ON;\n }\n return undefined;\n }\n\n // Case when we are in dimmer or rgb lamp, and it does not have a dedicated power switch\n if (\n this._multiPurposeProperty &&\n !this._handleSimilarEvents &&\n event.directive.header.namespace === 'Alexa.BrightnessController'\n ) {\n const brightness = event.directive.payload.brightness as number;\n if (brightness) {\n return PowerState.ON;\n }\n return PowerState.OFF;\n }\n\n // Case when we are in dimmer or rgb lamp, and it the device has a dedicated power switch\n if (this._handleSimilarEvents && event.directive.header.namespace === 'Alexa.BrightnessController') {\n const brightness = event.directive.payload.brightness as number;\n if (brightness && !this.currentValue) {\n return PowerState.ON;\n }\n return undefined;\n }\n\n return event.directive.header.name === 'TurnOn' ? PowerState.ON : PowerState.OFF;\n }\n\n alexaValue(value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n if (this._stateType === 'number') {\n const min = this.valuesRangeMin as number;\n const max = this.valuesRangeMax as number;\n if (min === undefined || max === undefined) {\n return (value as number) > 0 ? PowerState.ON : PowerState.OFF;\n }\n const mid = min + (max - min) / 2;\n if ((value as number) >= mid) {\n return PowerState.ON;\n }\n return PowerState.OFF;\n }\n return value === true ? PowerState.ON : value === false ? PowerState.OFF : undefined;\n }\n\n value(alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n if (this._stateType === 'number') {\n const min = this.valuesRangeMin as number;\n const max = this.valuesRangeMax as number;\n if (min === undefined || max === undefined) {\n return alexaValue === PowerState.ON ? 1 : alexaValue === PowerState.OFF ? 0 : undefined;\n }\n return alexaValue === PowerState.ON ? max : alexaValue === PowerState.OFF ? min : undefined;\n }\n\n return alexaValue === PowerState.ON ? true : alexaValue === PowerState.OFF ? false : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"PowerState.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/PowerState.ts"],"names":[],"mappings":"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","sourcesContent":["import Base from './Base';\nimport type { AlexaV3DirectiveName, AlexaV3DirectiveValue, AlexaV3Request } from '../../types';\n\nexport default class PowerState extends Base {\n matches(event: AlexaV3Request): boolean {\n const namespace = event?.directive?.header?.namespace;\n const eventName = event?.directive?.header?.name || '';\n return (\n namespace === 'Alexa.PowerController' ||\n ((this._multiPurposeProperty || this._handleSimilarEvents) &&\n namespace === 'Alexa.PercentageController' &&\n !eventName.includes('Adjust')) ||\n ((this._multiPurposeProperty || this._handleSimilarEvents) &&\n namespace === 'Alexa.BrightnessController' &&\n !eventName.includes('Adjust'))\n );\n }\n\n static get ON(): AlexaV3DirectiveName {\n return 'ON';\n }\n\n static get OFF(): AlexaV3DirectiveName {\n return 'OFF';\n }\n\n alexaDirectiveValue(event: AlexaV3Request): AlexaV3DirectiveValue {\n // Case when we are in dimmer or rgb lamp, and it does not have a dedicated power switch\n if (\n this._multiPurposeProperty &&\n !this._handleSimilarEvents &&\n event.directive.header.namespace === 'Alexa.PercentageController'\n ) {\n const percentage = event.directive.payload.percentage as number;\n if (percentage) {\n return PowerState.ON;\n }\n return PowerState.OFF;\n }\n\n if (this._handleSimilarEvents && event.directive.header.namespace === 'Alexa.PercentageController') {\n const percentage = event.directive.payload.percentage as number;\n if (percentage && !this.currentValue) {\n return PowerState.ON;\n }\n return undefined;\n }\n\n // Case when we are in dimmer or rgb lamp, and it does not have a dedicated power switch\n if (\n this._multiPurposeProperty &&\n !this._handleSimilarEvents &&\n event.directive.header.namespace === 'Alexa.BrightnessController'\n ) {\n const brightness = event.directive.payload.brightness as number;\n if (brightness) {\n return PowerState.ON;\n }\n return PowerState.OFF;\n }\n\n // Case when we are in dimmer or rgb lamp, and it the device has a dedicated power switch\n if (this._handleSimilarEvents && event.directive.header.namespace === 'Alexa.BrightnessController') {\n const brightness = event.directive.payload.brightness as number;\n if (brightness && !this.currentValue) {\n return PowerState.ON;\n }\n return undefined;\n }\n\n return event.directive.header.name === 'TurnOn' ? PowerState.ON : PowerState.OFF;\n }\n\n alexaValue(value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n if (this._stateType === 'number') {\n const min = this.valuesRangeMin as number;\n // In this case, it is important if max is set or not\n const max = this.valueRealMax;\n\n if (min === undefined || max === undefined) {\n return (value as number) > 0 ? PowerState.ON : PowerState.OFF;\n }\n const mid = min + ((max as number) - min) / 2;\n if ((value as number) >= mid) {\n return PowerState.ON;\n }\n return PowerState.OFF;\n }\n return value === true ? PowerState.ON : value === false ? PowerState.OFF : undefined;\n }\n\n value(alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n if (this._stateType === 'number') {\n const min = this.valuesRangeMin as number;\n const max = this.valueRealMax;\n if (min === undefined || max === undefined) {\n return alexaValue === PowerState.ON ? 1 : alexaValue === PowerState.OFF ? 0 : undefined;\n }\n return alexaValue === PowerState.ON ? (max as number) : alexaValue === PowerState.OFF ? min : undefined;\n }\n\n return alexaValue === PowerState.ON ? true : alexaValue === PowerState.OFF ? false : undefined;\n }\n}\n"]}
@@ -11,6 +11,9 @@ class RelativeHumidity extends Base_1.default {
11
11
  matches(event) {
12
12
  return RelativeHumidity.matches(event);
13
13
  }
14
+ reportValue(value) {
15
+ return { value };
16
+ }
14
17
  }
15
18
  exports.default = RelativeHumidity;
16
19
  //# sourceMappingURL=RelativeHumidity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RelativeHumidity.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/RelativeHumidity.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAG1B,MAAqB,gBAAiB,SAAQ,cAAI;IAC9C,MAAM,CAAC,OAAO,CAAC,KAAqB;QAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,KAAK,sBAAsB,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,KAAqB;QACzB,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;CACJ;AARD,mCAQC","sourcesContent":["import Base from './Base';\nimport type { AlexaV3Request } from '../../types';\n\nexport default class RelativeHumidity extends Base {\n static matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.namespace === 'Alexa.HumiditySensor';\n }\n\n matches(event: AlexaV3Request): boolean {\n return RelativeHumidity.matches(event);\n }\n}\n"]}
1
+ {"version":3,"file":"RelativeHumidity.js","sourceRoot":"","sources":["../../../../../src/lib/AlexaSmartHomeV3/Alexa/Properties/RelativeHumidity.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAG1B,MAAqB,gBAAiB,SAAQ,cAAI;IAC9C,MAAM,CAAC,OAAO,CAAC,KAAqB;QAChC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,KAAK,sBAAsB,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,KAAqB;QACzB,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,WAAW,CAAC,KAA4B;QACpC,OAAO,EAAE,KAAK,EAAE,CAAC;IACrB,CAAC;CACJ;AAZD,mCAYC","sourcesContent":["import Base from './Base';\nimport type { AlexaV3DirectiveValue, AlexaV3Request } from '../../types';\n\nexport default class RelativeHumidity extends Base {\n static matches(event: AlexaV3Request): boolean {\n return event?.directive?.header?.namespace === 'Alexa.HumiditySensor';\n }\n\n matches(event: AlexaV3Request): boolean {\n return RelativeHumidity.matches(event);\n }\n\n reportValue(value: AlexaV3DirectiveValue): any {\n return { value };\n }\n}\n"]}
@@ -318,7 +318,7 @@ class Control {
318
318
  const map = this.statesMap;
319
319
  return {
320
320
  setState: this.states[map.set],
321
- getState: this.states[map.actual],
321
+ getState: this.states[map.actual] || this.states[map.set],
322
322
  alexaSetter: function (alexaValue) {
323
323
  return alexaValue === PowerState_1.default.ON;
324
324
  },
@@ -1 +1 @@
1
- {"version":3,"file":"Control.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/Control.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Types } from '@iobroker/type-detector';\n\nimport AlexaResponse from '../Alexa/AlexaResponse';\nimport { firstLower, className, ensureValueInRange_0_100, denormalize_0_100, normalize_0_100 } from '../Helpers/Utils';\nimport Logger from '../Helpers/Logger';\nimport AdapterProvider from '../Helpers/AdapterProvider';\nimport type { ControlStateInitObject, Base as PropertiesBase } from '../Alexa/Properties/Base';\nimport PowerState from '../Alexa/Properties/PowerState';\nimport DetectionState from '../Alexa/Properties/DetectionState';\nimport type {\n AlexaV3Category,\n AlexaV3DirectiveValue,\n AlexaV3ReportedState,\n AlexaV3Request,\n IotExternalDetectorState,\n IotExternalPatternControl,\n SmartName,\n} from '../types';\nimport type { Base as CapabilitiesBase } from '../Alexa/Capabilities/Base';\n\nexport type StateName =\n | 'ACTUAL'\n | 'BLUE'\n | 'BRIGHTNESS'\n | 'DIMMER'\n | 'GREEN'\n | 'HUE'\n | 'MODE'\n | 'MUTE'\n | 'ON'\n | 'ON_ACTUAL'\n | 'ON_SET'\n | 'POWER'\n | 'RED'\n | 'RGB'\n | 'RGBW'\n | 'SATURATION'\n | 'SECOND'\n | 'SET'\n | 'TEMPERATURE'\n | 'UNREACH'\n | 'WHITE';\n\n/**\n * Represents the base functionality for a control in a smart device. A smart device has at least one control.\n * The specific functionality, natively supported capabilities, etc. are defined in derived classes.\n */\nexport default class Control {\n static stateKeys: StateName[] = [\n 'ACTUAL',\n 'BLUE',\n 'BRIGHTNESS',\n 'DIMMER',\n 'GREEN',\n 'HUE',\n 'MODE',\n 'MUTE',\n 'ON',\n 'ON_ACTUAL',\n 'ON_SET',\n 'POWER',\n 'RED',\n 'RGB',\n 'RGBW',\n 'SATURATION',\n 'SECOND',\n 'SET',\n 'TEMPERATURE',\n 'UNREACH',\n 'WHITE',\n ];\n public readonly log: Logger;\n protected _supported: CapabilitiesBase[];\n protected _enforced: CapabilitiesBase[];\n protected readonly _states: Record<string, IotExternalDetectorState | undefined> = {};\n protected smartName: SmartName | undefined;\n\n /**\n * @param detectedControl - The detected control in terms of iobroker type detector.\n */\n constructor(detectedControl: IotExternalPatternControl) {\n this.log = new Logger(this);\n this.log.silly(`created instance`);\n // find smartName\n const stateWithSmartName = detectedControl.states.find(s => s.smartName);\n this.smartName = stateWithSmartName?.smartName;\n\n this.initStates(detectedControl);\n this._supported = [];\n this._enforced = [];\n }\n\n get allCapabilities(): CapabilitiesBase[] {\n return this.supported.concat(this.enforced);\n }\n\n static get type(): Types {\n return firstLower(className(this.toString())) as Types;\n }\n /**\n * Getter for Alexa categories\n */\n get categories(): AlexaV3Category[] {\n return ['OTHER'];\n }\n\n get name(): string {\n return `${this.constructor.name}`;\n }\n /**\n * Getter for _supported\n */\n get supported(): CapabilitiesBase[] {\n return this._supported;\n }\n /**\n * Getter for _enforced\n */\n get enforced(): CapabilitiesBase[] {\n return this._enforced;\n }\n /**\n * This function returns whether the control natively supports the passed on Alexa directive.\n *\n * @param event The event containing the Alexa directive as it comes from AWS Alexa Service\n * @returns True if the control natively supports the directive, false - otherwise\n */\n supports(event: AlexaV3Request): boolean {\n return this.supported.find(capability => capability.matches(event)) !== undefined;\n }\n /**\n * This function returns whether the control though doesn't natively support the passed on Alexa directive, but able to handle it.\n *\n * @param event The event containing the Alexa directive as it comes from AWS Alexa Service\n * @returns True if the control can handle the directive, false - otherwise\n */\n canHandle(event: AlexaV3Request): boolean {\n return this.enforced.find(capability => capability.matches(event)) !== undefined;\n }\n /**\n * This function processes an Alexa directive. Usually the result of the processing is setting an iobroker state to some value\n * as a reaction to an interaction with Alexa via voice, app, etc.\n *\n * @param event The event containing the Alexa directive as it comes from AWS Alexa Service\n * @returns Object containing the response to be sent to Alexa Service\n */\n async handle(event: AlexaV3Request): Promise<AlexaResponse> {\n this.log.debug(`handling Alexa event`);\n this.log.silly(`${JSON.stringify(event)}`);\n\n const properties = this.allCapabilities\n .flatMap(item => item.properties)\n .filter(property => property.matches(event));\n\n let response: AlexaResponse | null = null;\n\n for (const property of properties) {\n let alexaValue: AlexaV3DirectiveValue;\n try {\n const setter = this.valueSetter(event);\n alexaValue = await setter(event, property);\n } catch (error) {\n this.log.debug(`${error}`);\n this.log.error(`failed handling Alexa event`);\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 // even though the handler successfully processed the Alexa event,\n // we return an error here for ENFORCED capabilities, to prevent\n // reporting multiple successes for the same capability and\n // running into a situation of returning a wrong value back to Alexa\n if (this.enforced.find(capability => capability.matches(event))) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(\n AlexaResponse.directiveNotSupportedByControl(\n this.name,\n event?.directive?.header?.namespace,\n event?.directive?.header?.messageId,\n event?.directive?.header?.payloadVersion,\n ).get(),\n );\n }\n\n if (alexaValue !== undefined) {\n if (!response) {\n response = AlexaResponse.handled(\n event,\n property.propertyName,\n property.reportValue(alexaValue),\n property.instance,\n );\n } else {\n response.addContextProperty({\n namespace: event?.directive?.header?.namespace,\n name: property.propertyName,\n instance: property.instance,\n value: property.reportValue(alexaValue),\n });\n }\n }\n\n // though the processed directive required to change a single value, the response must contain values of all \"relevant\" properties\n // Please refer to this for details: https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-thermostatcontroller.html#settargettemperature-response-event\n }\n\n if (response) {\n this.log.silly(`${JSON.stringify(response.get())}`);\n return response.get();\n }\n\n const errorResponse = AlexaResponse.directiveNotSupportedByControl(\n this.name,\n event?.directive?.header?.namespace,\n event?.directive?.header?.messageId,\n event?.directive?.header?.payloadVersion,\n );\n this.log.silly(`${JSON.stringify(errorResponse.get())}`);\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(errorResponse.get());\n }\n\n valueSetter(\n _event: AlexaV3Request,\n ): (event: AlexaV3Request, property: PropertiesBase) => Promise<AlexaV3DirectiveValue> {\n return this.setValue.bind(this);\n }\n\n async setValue(event: AlexaV3Request, property: PropertiesBase): Promise<AlexaV3DirectiveValue> {\n // extract alexa value from event\n const alexaValue = property.alexaDirectiveValue(event);\n\n // convert alexa value to iobroker value\n let value: ioBroker.StateValue | undefined = property.value(alexaValue);\n\n // if set, the device could support toggle\n if (event.currentState) {\n // console.error(`----------------------------------- command: ${value}, current value: ${JSON.stringify(event.currentState)}`);\n const state = event.currentState.find(item => item.name === property.propertyName);\n if (state && value === true) {\n // it could support toggle.\n // get current value\n const current = property.value(state.value);\n if (current === true) {\n // turn off\n value = false;\n } else if (current !== false) {\n const currentValue = await this.getOrRetrieveCurrentValue(property);\n if (currentValue === true) {\n // turn off\n value = false;\n }\n }\n }\n }\n\n // set iobroker state\n if (value !== undefined) {\n await this.setState(property, value);\n property.currentValue = value;\n // return value as expected by Alexa\n return property.alexaValue(value);\n }\n return undefined;\n }\n\n async adjustValue(event: AlexaV3Request, property: PropertiesBase): Promise<AlexaV3DirectiveValue> {\n // extract Alexa delta value from event\n const delta = property.alexaDirectiveValue(event);\n // get current value\n const currentValue = await this.getOrRetrieveCurrentValue(property);\n // convert the current value to Alexa value\n const valueToAdjust = property.alexaValue(currentValue);\n // adjust Alexa value\n const adjustedValue = ensureValueInRange_0_100(\n parseFloat((valueToAdjust as string) || '0') + parseFloat((delta as string) || '0'),\n );\n // convert adjusted value to iobroker value\n const value = property.value(adjustedValue);\n\n // set iobroker state\n await this.setState(property, value as ioBroker.StateValue);\n\n return adjustedValue;\n }\n\n protected async getOrRetrieveCurrentValue(property: PropertiesBase): Promise<ioBroker.StateValue> {\n if (property.currentValue === undefined) {\n const id = property.getId;\n if (!id && property.propertyName === 'connectivity') {\n // this is an exception\n property.currentValue = false;\n } else {\n if (!id) {\n throw new Error(`no ID defined for property \"${property.propertyName}\" of \"${this.name}\"`);\n }\n property.currentValue = await AdapterProvider.getState(id);\n }\n }\n\n if (property.currentValue === undefined) {\n throw new Error(`unable to retrieve ${property.getId}`);\n }\n\n return property.currentValue;\n }\n\n async reportState(): Promise<AlexaV3ReportedState[]> {\n const propertiesToReport: AlexaV3ReportedState[] = [];\n\n for (const capability of this.supported) {\n for (const property of capability.properties) {\n try {\n await this.getOrRetrieveCurrentValue(property);\n\n const toReport: AlexaV3ReportedState = {\n namespace: capability.namespace,\n instance: property.instance,\n name: property.propertyName,\n value: property.reportValue(property.alexaValue(property.currentValue)),\n };\n\n if (!toReport.instance) {\n delete toReport.instance;\n }\n\n propertiesToReport.push(toReport);\n } catch (error) {\n this.log.error(`failed reporting state for property \"${property.propertyName}\" of \"${this.name}\"`);\n if (error.stack) {\n this.log.debug(`${error.stack}`);\n }\n this.log.debug(`${error}`);\n }\n }\n }\n\n this.log.debug(`reporting state: ${JSON.stringify(propertiesToReport)}`);\n return propertiesToReport;\n }\n\n toString(): string {\n return `${this.constructor.name}`;\n }\n\n private initStates(ctrl: IotExternalPatternControl): void {\n for (const stateKey of Control.stateKeys) {\n this._states[stateKey] = ctrl.states.find(s => s.name === stateKey);\n }\n }\n\n get states(): Record<string, IotExternalDetectorState | undefined> {\n return this._states;\n }\n\n get statesMap(): { [lowCaseName: string]: StateName } {\n const map: { [lowCaseName: string]: StateName } = {};\n for (const stateKey of Control.stateKeys) {\n map[stateKey.toLowerCase()] = stateKey;\n }\n return map;\n }\n\n async setState(property: PropertiesBase, value: ioBroker.StateValue): Promise<void> {\n await AdapterProvider.setState(property.setId, value);\n property.currentValue = value;\n }\n\n //-------------------------------------------------------\n // standard property init objects\n //\n\n protected blankInitObject(): ControlStateInitObject {\n // const states = this.initStates(ctrl);\n const map = this.statesMap;\n return {\n setState: this.states[map.actual]!,\n getState: this.states[map.actual]!,\n };\n }\n\n protected connectivityInitObject(alwaysReturn?: boolean): ControlStateInitObject | null {\n const map = this.statesMap;\n const state = this.states[map.unreach];\n if (state?.id.toLowerCase().includes('sticky_')) {\n state.id = state.id.replace(/\\.sticky_/i, '');\n }\n if (!state) {\n if (alwaysReturn) {\n return {\n getState: { id: '', smartName: '', common: {}, name: 'UNREACH' },\n setState: { id: '', smartName: '', common: {}, name: 'UNREACH' },\n };\n }\n return null;\n }\n return {\n setState: this.states[map.unreach],\n getState: this.states[map.unreach],\n };\n }\n\n protected powerStateInitObject(): ControlStateInitObject {\n // const states = this.initStates(ctrl);\n const map = this.statesMap;\n\n return {\n setState: this.states[map.set]!,\n getState: this.states[map.actual]!,\n alexaSetter: function (alexaValue) {\n return alexaValue === PowerState.ON;\n },\n alexaGetter: function (value) {\n return value ? PowerState.ON : PowerState.OFF;\n },\n };\n }\n\n protected detectedStateInitObject(): ControlStateInitObject {\n const map = this.statesMap;\n return {\n setState: this.states[map.actual]!,\n getState: this.states[map.actual]!,\n alexaSetter: function (_alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n // should be never called\n return 0;\n },\n alexaGetter: function (value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n return value ? DetectionState.DETECTED : DetectionState.NOT_DETECTED;\n },\n };\n }\n\n protected percentageInitObject(): ControlStateInitObject {\n const map = this.statesMap;\n // const range = configuredRangeOrDefault(this.states[map.set]);\n return {\n setState: this.states[map.set]!,\n getState: this.states[map.actual]!,\n alexaSetter: function (this: PropertiesBase, alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue {\n return (\n denormalize_0_100(\n alexaValue as number,\n this.valuesRangeMin as number,\n this.valuesRangeMax as number,\n ) || 0\n );\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n return normalize_0_100(value as number, this.valuesRangeMin as number, this.valuesRangeMax as number);\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"Control.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/Control.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Types } from '@iobroker/type-detector';\n\nimport AlexaResponse from '../Alexa/AlexaResponse';\nimport { firstLower, className, ensureValueInRange_0_100, denormalize_0_100, normalize_0_100 } from '../Helpers/Utils';\nimport Logger from '../Helpers/Logger';\nimport AdapterProvider from '../Helpers/AdapterProvider';\nimport type { ControlStateInitObject, Base as PropertiesBase } from '../Alexa/Properties/Base';\nimport PowerState from '../Alexa/Properties/PowerState';\nimport DetectionState from '../Alexa/Properties/DetectionState';\nimport type {\n AlexaV3Category,\n AlexaV3DirectiveValue,\n AlexaV3ReportedState,\n AlexaV3Request,\n IotExternalDetectorState,\n IotExternalPatternControl,\n SmartName,\n} from '../types';\nimport type { Base as CapabilitiesBase } from '../Alexa/Capabilities/Base';\n\nexport type StateName =\n | 'ACTUAL'\n | 'BLUE'\n | 'BRIGHTNESS'\n | 'DIMMER'\n | 'GREEN'\n | 'HUE'\n | 'MODE'\n | 'MUTE'\n | 'ON'\n | 'ON_ACTUAL'\n | 'ON_SET'\n | 'POWER'\n | 'RED'\n | 'RGB'\n | 'RGBW'\n | 'SATURATION'\n | 'SECOND'\n | 'SET'\n | 'TEMPERATURE'\n | 'UNREACH'\n | 'WHITE';\n\n/**\n * Represents the base functionality for a control in a smart device. A smart device has at least one control.\n * The specific functionality, natively supported capabilities, etc. are defined in derived classes.\n */\nexport default class Control {\n static stateKeys: StateName[] = [\n 'ACTUAL',\n 'BLUE',\n 'BRIGHTNESS',\n 'DIMMER',\n 'GREEN',\n 'HUE',\n 'MODE',\n 'MUTE',\n 'ON',\n 'ON_ACTUAL',\n 'ON_SET',\n 'POWER',\n 'RED',\n 'RGB',\n 'RGBW',\n 'SATURATION',\n 'SECOND',\n 'SET',\n 'TEMPERATURE',\n 'UNREACH',\n 'WHITE',\n ];\n public readonly log: Logger;\n protected _supported: CapabilitiesBase[];\n protected _enforced: CapabilitiesBase[];\n protected readonly _states: Record<string, IotExternalDetectorState | undefined> = {};\n protected smartName: SmartName | undefined;\n\n /**\n * @param detectedControl - The detected control in terms of iobroker type detector.\n */\n constructor(detectedControl: IotExternalPatternControl) {\n this.log = new Logger(this);\n this.log.silly(`created instance`);\n // find smartName\n const stateWithSmartName = detectedControl.states.find(s => s.smartName);\n this.smartName = stateWithSmartName?.smartName;\n\n this.initStates(detectedControl);\n this._supported = [];\n this._enforced = [];\n }\n\n get allCapabilities(): CapabilitiesBase[] {\n return this.supported.concat(this.enforced);\n }\n\n static get type(): Types {\n return firstLower(className(this.toString())) as Types;\n }\n /**\n * Getter for Alexa categories\n */\n get categories(): AlexaV3Category[] {\n return ['OTHER'];\n }\n\n get name(): string {\n return `${this.constructor.name}`;\n }\n /**\n * Getter for _supported\n */\n get supported(): CapabilitiesBase[] {\n return this._supported;\n }\n /**\n * Getter for _enforced\n */\n get enforced(): CapabilitiesBase[] {\n return this._enforced;\n }\n /**\n * This function returns whether the control natively supports the passed on Alexa directive.\n *\n * @param event The event containing the Alexa directive as it comes from AWS Alexa Service\n * @returns True if the control natively supports the directive, false - otherwise\n */\n supports(event: AlexaV3Request): boolean {\n return this.supported.find(capability => capability.matches(event)) !== undefined;\n }\n /**\n * This function returns whether the control though doesn't natively support the passed on Alexa directive, but able to handle it.\n *\n * @param event The event containing the Alexa directive as it comes from AWS Alexa Service\n * @returns True if the control can handle the directive, false - otherwise\n */\n canHandle(event: AlexaV3Request): boolean {\n return this.enforced.find(capability => capability.matches(event)) !== undefined;\n }\n /**\n * This function processes an Alexa directive. Usually the result of the processing is setting an iobroker state to some value\n * as a reaction to an interaction with Alexa via voice, app, etc.\n *\n * @param event The event containing the Alexa directive as it comes from AWS Alexa Service\n * @returns Object containing the response to be sent to Alexa Service\n */\n async handle(event: AlexaV3Request): Promise<AlexaResponse> {\n this.log.debug(`handling Alexa event`);\n this.log.silly(`${JSON.stringify(event)}`);\n\n const properties = this.allCapabilities\n .flatMap(item => item.properties)\n .filter(property => property.matches(event));\n\n let response: AlexaResponse | null = null;\n\n for (const property of properties) {\n let alexaValue: AlexaV3DirectiveValue;\n try {\n const setter = this.valueSetter(event);\n alexaValue = await setter(event, property);\n } catch (error) {\n this.log.debug(`${error}`);\n this.log.error(`failed handling Alexa event`);\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 // even though the handler successfully processed the Alexa event,\n // we return an error here for ENFORCED capabilities, to prevent\n // reporting multiple successes for the same capability and\n // running into a situation of returning a wrong value back to Alexa\n if (this.enforced.find(capability => capability.matches(event))) {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(\n AlexaResponse.directiveNotSupportedByControl(\n this.name,\n event?.directive?.header?.namespace,\n event?.directive?.header?.messageId,\n event?.directive?.header?.payloadVersion,\n ).get(),\n );\n }\n\n if (alexaValue !== undefined) {\n if (!response) {\n response = AlexaResponse.handled(\n event,\n property.propertyName,\n property.reportValue(alexaValue),\n property.instance,\n );\n } else {\n response.addContextProperty({\n namespace: event?.directive?.header?.namespace,\n name: property.propertyName,\n instance: property.instance,\n value: property.reportValue(alexaValue),\n });\n }\n }\n\n // though the processed directive required to change a single value, the response must contain values of all \"relevant\" properties\n // Please refer to this for details: https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-thermostatcontroller.html#settargettemperature-response-event\n }\n\n if (response) {\n this.log.silly(`${JSON.stringify(response.get())}`);\n return response.get();\n }\n\n const errorResponse = AlexaResponse.directiveNotSupportedByControl(\n this.name,\n event?.directive?.header?.namespace,\n event?.directive?.header?.messageId,\n event?.directive?.header?.payloadVersion,\n );\n this.log.silly(`${JSON.stringify(errorResponse.get())}`);\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n return Promise.reject(errorResponse.get());\n }\n\n valueSetter(\n _event: AlexaV3Request,\n ): (event: AlexaV3Request, property: PropertiesBase) => Promise<AlexaV3DirectiveValue> {\n return this.setValue.bind(this);\n }\n\n async setValue(event: AlexaV3Request, property: PropertiesBase): Promise<AlexaV3DirectiveValue> {\n // extract alexa value from event\n const alexaValue = property.alexaDirectiveValue(event);\n\n // convert alexa value to iobroker value\n let value: ioBroker.StateValue | undefined = property.value(alexaValue);\n\n // if set, the device could support toggle\n if (event.currentState) {\n // console.error(`----------------------------------- command: ${value}, current value: ${JSON.stringify(event.currentState)}`);\n const state = event.currentState.find(item => item.name === property.propertyName);\n if (state && value === true) {\n // it could support toggle.\n // get current value\n const current = property.value(state.value);\n if (current === true) {\n // turn off\n value = false;\n } else if (current !== false) {\n const currentValue = await this.getOrRetrieveCurrentValue(property);\n if (currentValue === true) {\n // turn off\n value = false;\n }\n }\n }\n }\n\n // set iobroker state\n if (value !== undefined) {\n await this.setState(property, value);\n property.currentValue = value;\n // return value as expected by Alexa\n return property.alexaValue(value);\n }\n return undefined;\n }\n\n async adjustValue(event: AlexaV3Request, property: PropertiesBase): Promise<AlexaV3DirectiveValue> {\n // extract Alexa delta value from event\n const delta = property.alexaDirectiveValue(event);\n // get current value\n const currentValue = await this.getOrRetrieveCurrentValue(property);\n // convert the current value to Alexa value\n const valueToAdjust = property.alexaValue(currentValue);\n // adjust Alexa value\n const adjustedValue = ensureValueInRange_0_100(\n parseFloat((valueToAdjust as string) || '0') + parseFloat((delta as string) || '0'),\n );\n // convert adjusted value to iobroker value\n const value = property.value(adjustedValue);\n\n // set iobroker state\n await this.setState(property, value as ioBroker.StateValue);\n\n return adjustedValue;\n }\n\n protected async getOrRetrieveCurrentValue(property: PropertiesBase): Promise<ioBroker.StateValue> {\n if (property.currentValue === undefined) {\n const id = property.getId;\n if (!id && property.propertyName === 'connectivity') {\n // this is an exception\n property.currentValue = false;\n } else {\n if (!id) {\n throw new Error(`no ID defined for property \"${property.propertyName}\" of \"${this.name}\"`);\n }\n property.currentValue = await AdapterProvider.getState(id);\n }\n }\n\n if (property.currentValue === undefined) {\n throw new Error(`unable to retrieve ${property.getId}`);\n }\n\n return property.currentValue;\n }\n\n async reportState(): Promise<AlexaV3ReportedState[]> {\n const propertiesToReport: AlexaV3ReportedState[] = [];\n\n for (const capability of this.supported) {\n for (const property of capability.properties) {\n try {\n await this.getOrRetrieveCurrentValue(property);\n\n const toReport: AlexaV3ReportedState = {\n namespace: capability.namespace,\n instance: property.instance,\n name: property.propertyName,\n value: property.reportValue(property.alexaValue(property.currentValue)),\n };\n\n if (!toReport.instance) {\n delete toReport.instance;\n }\n\n propertiesToReport.push(toReport);\n } catch (error) {\n this.log.error(`failed reporting state for property \"${property.propertyName}\" of \"${this.name}\"`);\n if (error.stack) {\n this.log.debug(`${error.stack}`);\n }\n this.log.debug(`${error}`);\n }\n }\n }\n\n this.log.debug(`reporting state: ${JSON.stringify(propertiesToReport)}`);\n return propertiesToReport;\n }\n\n toString(): string {\n return `${this.constructor.name}`;\n }\n\n private initStates(ctrl: IotExternalPatternControl): void {\n for (const stateKey of Control.stateKeys) {\n this._states[stateKey] = ctrl.states.find(s => s.name === stateKey);\n }\n }\n\n get states(): Record<string, IotExternalDetectorState | undefined> {\n return this._states;\n }\n\n get statesMap(): { [lowCaseName: string]: StateName } {\n const map: { [lowCaseName: string]: StateName } = {};\n for (const stateKey of Control.stateKeys) {\n map[stateKey.toLowerCase()] = stateKey;\n }\n return map;\n }\n\n async setState(property: PropertiesBase, value: ioBroker.StateValue): Promise<void> {\n await AdapterProvider.setState(property.setId, value);\n property.currentValue = value;\n }\n\n //-------------------------------------------------------\n // standard property init objects\n //\n\n protected blankInitObject(): ControlStateInitObject {\n // const states = this.initStates(ctrl);\n const map = this.statesMap;\n return {\n setState: this.states[map.actual]!,\n getState: this.states[map.actual]!,\n };\n }\n\n protected connectivityInitObject(alwaysReturn?: boolean): ControlStateInitObject | null {\n const map = this.statesMap;\n const state = this.states[map.unreach];\n if (state?.id.toLowerCase().includes('sticky_')) {\n state.id = state.id.replace(/\\.sticky_/i, '');\n }\n if (!state) {\n if (alwaysReturn) {\n return {\n getState: { id: '', smartName: '', common: {}, name: 'UNREACH' },\n setState: { id: '', smartName: '', common: {}, name: 'UNREACH' },\n };\n }\n return null;\n }\n return {\n setState: this.states[map.unreach],\n getState: this.states[map.unreach],\n };\n }\n\n protected powerStateInitObject(): ControlStateInitObject {\n // const states = this.initStates(ctrl);\n const map = this.statesMap;\n\n return {\n setState: this.states[map.set]!,\n getState: this.states[map.actual] || this.states[map.set]!,\n alexaSetter: function (alexaValue) {\n return alexaValue === PowerState.ON;\n },\n alexaGetter: function (value) {\n return value ? PowerState.ON : PowerState.OFF;\n },\n };\n }\n\n protected detectedStateInitObject(): ControlStateInitObject {\n const map = this.statesMap;\n return {\n setState: this.states[map.actual]!,\n getState: this.states[map.actual]!,\n alexaSetter: function (_alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue | undefined {\n // should be never called\n return 0;\n },\n alexaGetter: function (value: ioBroker.StateValue | undefined): AlexaV3DirectiveValue {\n return value ? DetectionState.DETECTED : DetectionState.NOT_DETECTED;\n },\n };\n }\n\n protected percentageInitObject(): ControlStateInitObject {\n const map = this.statesMap;\n // const range = configuredRangeOrDefault(this.states[map.set]);\n return {\n setState: this.states[map.set]!,\n getState: this.states[map.actual]!,\n alexaSetter: function (this: PropertiesBase, alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue {\n return (\n denormalize_0_100(\n alexaValue as number,\n this.valuesRangeMin as number,\n this.valuesRangeMax as number,\n ) || 0\n );\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n return normalize_0_100(value as number, this.valuesRangeMin as number, this.valuesRangeMax as number);\n },\n };\n }\n}\n"]}
@@ -36,7 +36,7 @@ class Hue extends AdjustableControl_1.default {
36
36
  // if the state ON, DIMMER or BRIGHTNESS configured
37
37
  if (this.states[map.on] || this._brightness) {
38
38
  if (!this.states[map.on]) {
39
- this._offValue = (0, Utils_1.denormalize_0_100)(AdapterProvider_1.default.deviceOffLevel(), this._brightness.valuesRangeMin, this._brightness.valuesRangeMin || 100);
39
+ this._offValue = (0, Utils_1.denormalize_0_1)(AdapterProvider_1.default.deviceOffLevel(), this._brightness.valuesRangeMin, this._brightness.valuesRangeMax || 100);
40
40
  }
41
41
  this._supported.push(new Capabilities_1.default.PowerController(this.composeInitObjectPowerState()));
42
42
  }
@@ -60,11 +60,24 @@ class Hue extends AdjustableControl_1.default {
60
60
  property.currentValue = property.currentValue > this._offValue;
61
61
  }
62
62
  if (property.propertyName === Properties_1.default.Color.propertyName) {
63
+ let saturation = property.hal.saturation
64
+ ? await AdapterProvider_1.default.getState(property.hal.saturation)
65
+ : 100;
66
+ let brightness = property.hal.brightness
67
+ ? await AdapterProvider_1.default.getState(property.hal.brightness)
68
+ : 100;
69
+ // convert to HAL object
70
+ if (this._brightness) {
71
+ brightness = (0, Utils_1.normalize_0_1)(brightness, this._brightness.valuesRangeMin, this._brightness.valuesRangeMax);
72
+ }
73
+ if (this.states[map.saturation]) {
74
+ saturation = (0, Utils_1.normalize_0_1)(saturation, this.states[map.saturation].common.min || 0, this.states[map.saturation].common.max || 100);
75
+ }
63
76
  // @ts-expect-error special case for Hue property
64
77
  property.currentValue = {
65
78
  hue: property.currentValue,
66
- saturation: property.hal.saturation,
67
- brightness: property.hal.brightness,
79
+ saturation,
80
+ brightness,
68
81
  };
69
82
  }
70
83
  }
@@ -91,13 +104,22 @@ class Hue extends AdjustableControl_1.default {
91
104
  const colorProperty = property;
92
105
  const hueValue = (0, Utils_1.rgb2hal)(value);
93
106
  await AdapterProvider_1.default.setState(colorProperty.hal.hue, hueValue.hue);
107
+ const map = this.statesMap;
94
108
  if (colorProperty.hal.saturation) {
95
- await AdapterProvider_1.default.setState(colorProperty.hal.saturation, hueValue.saturation);
96
- }
97
- if (colorProperty.hal.brightness) {
98
- await AdapterProvider_1.default.setState(colorProperty.hal.brightness, hueValue.brightness);
109
+ // The saturation is from 0 to 1 in Alexa, but from 0 to 100 in ioBroker
110
+ const iobValue = (0, Utils_1.denormalize_0_1)(hueValue.saturation, this.states[map.saturation].common.min || 0, this.states[map.saturation].common.max || 100);
111
+ await AdapterProvider_1.default.setState(colorProperty.hal.saturation, iobValue);
99
112
  }
100
113
  // do not set brightness
114
+ // if (colorProperty.hal!.brightness) {
115
+ // // The brightness is from 0 to 1 in Alexa, but from 0 to 100 in ioBroker
116
+ // const iobValue = denormalize_0_1(
117
+ // hueValue.brightness,
118
+ // this.states[map.brightness]!.common.min || 0,
119
+ // this.states[map.brightness]!.common.max || 100,
120
+ // ) as number;
121
+ // await AdapterProvider.setState(colorProperty.hal!.brightness, iobValue);
122
+ // }
101
123
  // https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-colorcontroller.html
102
124
  // Important: For the best user experience, when you make a color change, maintain the current brightness setting of the endpoint.
103
125
  // For example, if a light bulb is currently set to white at 0.5 brightness, and a user requests a color change to red,
@@ -157,10 +179,14 @@ class Hue extends AdjustableControl_1.default {
157
179
  setState: this.states[map.dimmer] || this.states[map.brightness],
158
180
  getState: this.states[map.dimmer] || this.states[map.brightness],
159
181
  alexaSetter: function (alexaValue) {
160
- return ((0, Utils_1.denormalize_0_100)(alexaValue, this.valuesRangeMin, this.valuesRangeMax) ?? 0);
182
+ const ioBrokerValue = (0, Utils_1.denormalize_0_100)(alexaValue, this.valuesRangeMin, this.valuesRangeMax) ?? 0;
183
+ console.log('Alexa Setter Brightness:', alexaValue, '->', ioBrokerValue);
184
+ return ioBrokerValue;
161
185
  },
162
186
  alexaGetter: function (value) {
163
- return (0, Utils_1.normalize_0_100)(value, this.valuesRangeMin, this.valuesRangeMax);
187
+ const alexaValue = (0, Utils_1.normalize_0_100)(value, this.valuesRangeMin, this.valuesRangeMax);
188
+ console.log('Alexa Getter Brightness:', value, '->', alexaValue);
189
+ return alexaValue;
164
190
  },
165
191
  multiPurposeProperty: !this.states[map.on], // Could handle powerState events
166
192
  handleSimilarEvents: true, // If power set ON and brightness is 0, set to non-zero value
@@ -1 +1 @@
1
- {"version":3,"file":"Hue.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/Hue.ts"],"names":[],"mappings":"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","sourcesContent":["import Capabilities from '../Alexa/Capabilities';\nimport type BrightnessController from '../Alexa/Capabilities/BrightnessController';\nimport type ColorTemperatureController from '../Alexa/Capabilities/ColorTemperatureController';\nimport { denormalize_0_100, normalize_0_100, closestFromList, rgb2hal } from '../Helpers/Utils';\nimport Properties from '../Alexa/Properties';\nimport PowerState from '../Alexa/Properties/PowerState';\nimport Brightness from '../Alexa/Properties/Brightness';\nimport AdapterProvider from '../Helpers/AdapterProvider';\nimport AdjustableControl from './AdjustableControl';\nimport type { Base as PropertiesBase, ControlStateInitObject } from '../Alexa/Properties/Base';\nimport type { AlexaV3Category, AlexaV3DirectiveValue, AlexaV3Request, IotExternalPatternControl } from '../types';\nimport Color from '../Alexa/Properties/Color';\nimport ColorTemperatureInKelvin from '../Alexa/Properties/ColorTemperatureInKelvin';\nimport EndpointHealth from '../Alexa/Capabilities/EndpointHealth';\n\nexport default class Hue extends AdjustableControl {\n private readonly _brightnessCapability: BrightnessController | undefined;\n private readonly _brightness: Brightness | undefined;\n private readonly _colorTemperatureCapability: ColorTemperatureController | undefined;\n private readonly _offValue: number = 0;\n\n constructor(detectedControl: IotExternalPatternControl) {\n super(detectedControl);\n\n const map = this.statesMap;\n this._supported = [new Capabilities.ColorController(this.composeInitObjectColor())];\n\n // if the state DIMMER or BRIGHTNESS configured\n if (this.states[map.dimmer] || this.states[map.brightness]) {\n this._brightnessCapability = new Capabilities.BrightnessController(this.composeInitObjectBrightness());\n this._brightness = this._brightnessCapability.brightness;\n this._supported.push(this._brightnessCapability);\n }\n\n // if the state TEMPERATURE configured\n if (this.states[map.temperature]) {\n this._colorTemperatureCapability = new Capabilities.ColorTemperatureController(\n this.composeInitObjectColorTemperature(),\n );\n this._supported.push(this._colorTemperatureCapability);\n }\n\n // if the state ON, DIMMER or BRIGHTNESS configured\n if (this.states[map.on] || this._brightness) {\n if (!this.states[map.on]) {\n this._offValue = denormalize_0_100(\n AdapterProvider.deviceOffLevel(),\n this._brightness!.valuesRangeMin as number,\n (this._brightness!.valuesRangeMin as number) || 100,\n ) as number;\n }\n this._supported.push(new Capabilities.PowerController(this.composeInitObjectPowerState()));\n }\n\n const health = this.connectivityInitObject();\n if (health) {\n this._supported.push(new EndpointHealth(health));\n }\n }\n\n get categories(): AlexaV3Category[] {\n return ['LIGHT'];\n }\n\n adjustableProperties(): (typeof PropertiesBase)[] {\n return [Properties.ColorTemperatureInKelvin];\n }\n\n async getOrRetrieveCurrentValue(property: Color): Promise<ioBroker.StateValue> {\n const map = this.statesMap;\n\n if (property.currentValue === undefined) {\n property.currentValue = await AdapterProvider.getState(property.getId);\n // convert the non-zero brightness to power = true\n if (property.propertyName === Properties.PowerState.propertyName && !this.states[map.on]) {\n property.currentValue = (property.currentValue as number) > this._offValue;\n }\n\n if (property.propertyName === Properties.Color.propertyName) {\n // @ts-expect-error special case for Hue property\n property.currentValue = {\n hue: property.currentValue,\n saturation: property.hal!.saturation,\n brightness: property.hal!.brightness,\n };\n }\n }\n\n if (property.currentValue === undefined) {\n throw new Error(`unable to retrieve ${property.getId}`);\n }\n\n return property.currentValue;\n }\n\n async setState(property: PropertiesBase, value: ioBroker.StateValue | undefined): Promise<void> {\n if (property.propertyName === PowerState.propertyName) {\n if (this.states[this.statesMap.on]) {\n await AdapterProvider.setState(property.setId, value ?? false);\n property.currentValue = value;\n } else {\n // this will be processed in Brightness property\n }\n } else if (property.propertyName === Brightness.propertyName) {\n await AdapterProvider.setState(property.setId, value ?? 0);\n property.currentValue = value;\n } else if (property.propertyName === Color.propertyName) {\n const colorProperty = property as Color;\n const hueValue = rgb2hal(value as string);\n await AdapterProvider.setState(colorProperty.hal!.hue, hueValue.hue);\n if (colorProperty.hal!.saturation) {\n await AdapterProvider.setState(colorProperty.hal!.saturation, hueValue.saturation);\n }\n if (colorProperty.hal!.brightness) {\n await AdapterProvider.setState(colorProperty.hal!.brightness, hueValue.brightness);\n }\n\n // do not set brightness\n\n // https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-colorcontroller.html\n // Important: For the best user experience, when you make a color change, maintain the current brightness setting of the endpoint.\n // For example, if a light bulb is currently set to white at 0.5 brightness, and a user requests a color change to red,\n // the SetColor directive specifies hue = 0, saturation = 1, and brightness = 1. Here, set the hue to 0, the saturation to 1,\n // and ignore the brightness value of 1 in the directive. Instead, maintain the current brightness value of 0.5.\n\n property.currentValue = value;\n } else if (property.propertyName === ColorTemperatureInKelvin.propertyName) {\n await AdapterProvider.setState(property.setId, value ?? 2200);\n property.currentValue = value;\n }\n }\n\n async adjustValue(event: AlexaV3Request, property: PropertiesBase): Promise<AlexaV3DirectiveValue> {\n // extract Alexa delta value from event\n const delta = property.alexaDirectiveValue(event);\n\n // convert delta to iobroker value\n const value = property.value(delta);\n\n // set iobroker state\n await this.setState(property, value);\n\n return value as AlexaV3DirectiveValue;\n }\n\n private composeInitObjectPowerState(): ControlStateInitObject {\n const map = this.statesMap;\n return {\n setState: this.states[map.on] || this.states[map.dimmer] || this.states[map.brightness]!,\n getState:\n this.states[map.on_actual] ||\n this.states[map.on] ||\n this.states[map.dimmer] ||\n this.states[map.brightness]!,\n alexaSetter: function (this: PropertiesBase, alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue {\n return alexaValue === PowerState.ON;\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n return value ? PowerState.ON : PowerState.OFF;\n },\n multiPurposeProperty: !this.states[map.on], // Could handle brightness events\n handleSimilarEvents: true, // If brightness set to non-zero value and power is off, turn the lamp on\n };\n }\n\n private composeInitObjectBrightness(): ControlStateInitObject {\n const map = this.statesMap;\n let onValue: number | 'stored' | 'omit' | undefined = undefined;\n const offValue = AdapterProvider.deviceOffLevel();\n if (this.smartName && typeof this.smartName === 'object') {\n const byOn = this.smartName.byON;\n if (byOn !== null && byOn !== undefined && !isNaN(byOn as unknown as number)) {\n onValue = parseFloat(byOn as any);\n if (onValue < offValue) {\n onValue = offValue;\n }\n } else if (byOn === 'stored' || byOn === 'omit') {\n onValue = byOn;\n }\n }\n\n return {\n setState: this.states[map.dimmer] || this.states[map.brightness]!,\n getState: this.states[map.dimmer] || this.states[map.brightness]!,\n alexaSetter: function (this: PropertiesBase, alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue {\n return (\n denormalize_0_100(\n alexaValue as number,\n this.valuesRangeMin as number,\n this.valuesRangeMax as number,\n ) ?? 0\n );\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n return normalize_0_100(value as number, this.valuesRangeMin as number, this.valuesRangeMax as number);\n },\n multiPurposeProperty: !this.states[map.on], // Could handle powerState events\n handleSimilarEvents: true, // If power set ON and brightness is 0, set to non-zero value\n offValue,\n onValue,\n };\n }\n\n private composeInitObjectColor(): ControlStateInitObject {\n const map = this.statesMap;\n return {\n hal: {\n hue: this.states[map.hue]!,\n saturation: this.states[map.saturation],\n brightness: this.states[map.dimmer] || this.states[map.brightness],\n },\n };\n }\n\n private composeInitObjectColorTemperature(): ControlStateInitObject {\n const map = this.statesMap;\n const isMireds = this.states[map.temperature]?.common?.unit === 'mireds';\n\n return {\n setState: this.states[map.temperature]!,\n getState: this.states[map.temperature]!,\n alexaSetter: function (\n this: ColorTemperatureInKelvin,\n alexaValue: AlexaV3DirectiveValue,\n ): ioBroker.StateValue {\n if (alexaValue === 1) {\n // increase directive\n const closest = closestFromList(\n (this.currentValue as number) || this.colorTemperatureTable[0],\n this.colorTemperatureTable,\n );\n let index = this.colorTemperatureTable.indexOf(closest) + 1;\n index = index >= this.colorTemperatureTable.length ? this.colorTemperatureTable.length - 1 : index;\n return this.colorTemperatureTable[index];\n }\n if (alexaValue === -1) {\n // decrease directive\n const closest = closestFromList(\n (this.currentValue as number) || this.colorTemperatureTable[0],\n this.colorTemperatureTable,\n );\n let index = this.colorTemperatureTable.indexOf(closest) - 1;\n index = index < 0 ? 0 : index;\n return this.colorTemperatureTable[index];\n }\n // Convert Kelvin to mireds\n if (isMireds) {\n return Math.round(1000000 / (alexaValue as number));\n }\n return alexaValue as number;\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n // Convert Mireds to Kelvin\n if (isMireds) {\n return Math.round(1000000 / (value as number));\n }\n return value as number;\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"Hue.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Controls/Hue.ts"],"names":[],"mappings":"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","sourcesContent":["import Capabilities from '../Alexa/Capabilities';\nimport type BrightnessController from '../Alexa/Capabilities/BrightnessController';\nimport type ColorTemperatureController from '../Alexa/Capabilities/ColorTemperatureController';\nimport {\n denormalize_0_100,\n normalize_0_100,\n closestFromList,\n rgb2hal,\n normalize_0_1,\n denormalize_0_1,\n} from '../Helpers/Utils';\nimport Properties from '../Alexa/Properties';\nimport PowerState from '../Alexa/Properties/PowerState';\nimport Brightness from '../Alexa/Properties/Brightness';\nimport AdapterProvider from '../Helpers/AdapterProvider';\nimport AdjustableControl from './AdjustableControl';\nimport type { Base as PropertiesBase, ControlStateInitObject } from '../Alexa/Properties/Base';\nimport type { AlexaV3Category, AlexaV3DirectiveValue, AlexaV3Request, IotExternalPatternControl } from '../types';\nimport Color from '../Alexa/Properties/Color';\nimport ColorTemperatureInKelvin from '../Alexa/Properties/ColorTemperatureInKelvin';\nimport EndpointHealth from '../Alexa/Capabilities/EndpointHealth';\n\nexport default class Hue extends AdjustableControl {\n private readonly _brightnessCapability: BrightnessController | undefined;\n private readonly _brightness: Brightness | undefined;\n private readonly _colorTemperatureCapability: ColorTemperatureController | undefined;\n private readonly _offValue: number = 0;\n\n constructor(detectedControl: IotExternalPatternControl) {\n super(detectedControl);\n\n const map = this.statesMap;\n this._supported = [new Capabilities.ColorController(this.composeInitObjectColor())];\n\n // if the state DIMMER or BRIGHTNESS configured\n if (this.states[map.dimmer] || this.states[map.brightness]) {\n this._brightnessCapability = new Capabilities.BrightnessController(this.composeInitObjectBrightness());\n this._brightness = this._brightnessCapability.brightness;\n this._supported.push(this._brightnessCapability);\n }\n\n // if the state TEMPERATURE configured\n if (this.states[map.temperature]) {\n this._colorTemperatureCapability = new Capabilities.ColorTemperatureController(\n this.composeInitObjectColorTemperature(),\n );\n this._supported.push(this._colorTemperatureCapability);\n }\n\n // if the state ON, DIMMER or BRIGHTNESS configured\n if (this.states[map.on] || this._brightness) {\n if (!this.states[map.on]) {\n this._offValue = denormalize_0_1(\n AdapterProvider.deviceOffLevel(),\n this._brightness!.valuesRangeMin as number,\n (this._brightness!.valuesRangeMax as number) || 100,\n ) as number;\n }\n this._supported.push(new Capabilities.PowerController(this.composeInitObjectPowerState()));\n }\n\n const health = this.connectivityInitObject();\n if (health) {\n this._supported.push(new EndpointHealth(health));\n }\n }\n\n get categories(): AlexaV3Category[] {\n return ['LIGHT'];\n }\n\n adjustableProperties(): (typeof PropertiesBase)[] {\n return [Properties.ColorTemperatureInKelvin];\n }\n\n async getOrRetrieveCurrentValue(property: Color): Promise<ioBroker.StateValue> {\n const map = this.statesMap;\n\n if (property.currentValue === undefined) {\n property.currentValue = await AdapterProvider.getState(property.getId);\n // convert the non-zero brightness to power = true\n if (property.propertyName === Properties.PowerState.propertyName && !this.states[map.on]) {\n property.currentValue = (property.currentValue as number) > this._offValue;\n }\n\n if (property.propertyName === Properties.Color.propertyName) {\n let saturation = property.hal!.saturation\n ? await AdapterProvider.getState(property.hal!.saturation)\n : 100;\n let brightness = property.hal!.brightness\n ? await AdapterProvider.getState(property.hal!.brightness)\n : 100;\n // convert to HAL object\n if (this._brightness) {\n brightness = normalize_0_1(\n brightness as number,\n this._brightness.valuesRangeMin as number,\n this._brightness.valuesRangeMax as number,\n ) as number;\n }\n if (this.states[map.saturation]) {\n saturation = normalize_0_1(\n saturation as number,\n this.states[map.saturation]!.common.min || 0,\n this.states[map.saturation]!.common.max || 100,\n ) as number;\n }\n\n // @ts-expect-error special case for Hue property\n property.currentValue = {\n hue: property.currentValue,\n saturation,\n brightness,\n };\n }\n }\n\n if (property.currentValue === undefined) {\n throw new Error(`unable to retrieve ${property.getId}`);\n }\n\n return property.currentValue;\n }\n\n async setState(property: PropertiesBase, value: ioBroker.StateValue | undefined): Promise<void> {\n if (property.propertyName === PowerState.propertyName) {\n if (this.states[this.statesMap.on]) {\n await AdapterProvider.setState(property.setId, value ?? false);\n property.currentValue = value;\n } else {\n // this will be processed in Brightness property\n }\n } else if (property.propertyName === Brightness.propertyName) {\n await AdapterProvider.setState(property.setId, value ?? 0);\n property.currentValue = value;\n } else if (property.propertyName === Color.propertyName) {\n const colorProperty = property as Color;\n const hueValue = rgb2hal(value as string);\n await AdapterProvider.setState(colorProperty.hal!.hue, hueValue.hue);\n const map = this.statesMap;\n if (colorProperty.hal!.saturation) {\n // The saturation is from 0 to 1 in Alexa, but from 0 to 100 in ioBroker\n const iobValue = denormalize_0_1(\n hueValue.saturation,\n this.states[map.saturation]!.common.min || 0,\n this.states[map.saturation]!.common.max || 100,\n ) as number;\n\n await AdapterProvider.setState(colorProperty.hal!.saturation, iobValue);\n }\n // do not set brightness\n // if (colorProperty.hal!.brightness) {\n // // The brightness is from 0 to 1 in Alexa, but from 0 to 100 in ioBroker\n // const iobValue = denormalize_0_1(\n // hueValue.brightness,\n // this.states[map.brightness]!.common.min || 0,\n // this.states[map.brightness]!.common.max || 100,\n // ) as number;\n // await AdapterProvider.setState(colorProperty.hal!.brightness, iobValue);\n // }\n\n // https://developer.amazon.com/en-US/docs/alexa/device-apis/alexa-colorcontroller.html\n // Important: For the best user experience, when you make a color change, maintain the current brightness setting of the endpoint.\n // For example, if a light bulb is currently set to white at 0.5 brightness, and a user requests a color change to red,\n // the SetColor directive specifies hue = 0, saturation = 1, and brightness = 1. Here, set the hue to 0, the saturation to 1,\n // and ignore the brightness value of 1 in the directive. Instead, maintain the current brightness value of 0.5.\n\n property.currentValue = value;\n } else if (property.propertyName === ColorTemperatureInKelvin.propertyName) {\n await AdapterProvider.setState(property.setId, value ?? 2200);\n property.currentValue = value;\n }\n }\n\n async adjustValue(event: AlexaV3Request, property: PropertiesBase): Promise<AlexaV3DirectiveValue> {\n // extract Alexa delta value from event\n const delta = property.alexaDirectiveValue(event);\n\n // convert delta to iobroker value\n const value = property.value(delta);\n\n // set iobroker state\n await this.setState(property, value);\n\n return value as AlexaV3DirectiveValue;\n }\n\n private composeInitObjectPowerState(): ControlStateInitObject {\n const map = this.statesMap;\n return {\n setState: this.states[map.on] || this.states[map.dimmer] || this.states[map.brightness]!,\n getState:\n this.states[map.on_actual] ||\n this.states[map.on] ||\n this.states[map.dimmer] ||\n this.states[map.brightness]!,\n alexaSetter: function (this: PropertiesBase, alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue {\n return alexaValue === PowerState.ON;\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n return value ? PowerState.ON : PowerState.OFF;\n },\n multiPurposeProperty: !this.states[map.on], // Could handle brightness events\n handleSimilarEvents: true, // If brightness set to non-zero value and power is off, turn the lamp on\n };\n }\n\n private composeInitObjectBrightness(): ControlStateInitObject {\n const map = this.statesMap;\n let onValue: number | 'stored' | 'omit' | undefined = undefined;\n const offValue = AdapterProvider.deviceOffLevel();\n if (this.smartName && typeof this.smartName === 'object') {\n const byOn = this.smartName.byON;\n if (byOn !== null && byOn !== undefined && !isNaN(byOn as unknown as number)) {\n onValue = parseFloat(byOn as any);\n if (onValue < offValue) {\n onValue = offValue;\n }\n } else if (byOn === 'stored' || byOn === 'omit') {\n onValue = byOn;\n }\n }\n\n return {\n setState: this.states[map.dimmer] || this.states[map.brightness]!,\n getState: this.states[map.dimmer] || this.states[map.brightness]!,\n alexaSetter: function (this: PropertiesBase, alexaValue: AlexaV3DirectiveValue): ioBroker.StateValue {\n const ioBrokerValue =\n denormalize_0_100(\n alexaValue as number,\n this.valuesRangeMin as number,\n this.valuesRangeMax as number,\n ) ?? 0;\n console.log('Alexa Setter Brightness:', alexaValue, '->', ioBrokerValue);\n return ioBrokerValue;\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n const alexaValue = normalize_0_100(\n value as number,\n this.valuesRangeMin as number,\n this.valuesRangeMax as number,\n );\n console.log('Alexa Getter Brightness:', value, '->', alexaValue);\n return alexaValue;\n },\n multiPurposeProperty: !this.states[map.on], // Could handle powerState events\n handleSimilarEvents: true, // If power set ON and brightness is 0, set to non-zero value\n offValue,\n onValue,\n };\n }\n\n private composeInitObjectColor(): ControlStateInitObject {\n const map = this.statesMap;\n return {\n hal: {\n hue: this.states[map.hue]!,\n saturation: this.states[map.saturation],\n brightness: this.states[map.dimmer] || this.states[map.brightness],\n },\n };\n }\n\n private composeInitObjectColorTemperature(): ControlStateInitObject {\n const map = this.statesMap;\n const isMireds = this.states[map.temperature]?.common?.unit === 'mireds';\n\n return {\n setState: this.states[map.temperature]!,\n getState: this.states[map.temperature]!,\n alexaSetter: function (\n this: ColorTemperatureInKelvin,\n alexaValue: AlexaV3DirectiveValue,\n ): ioBroker.StateValue {\n if (alexaValue === 1) {\n // increase directive\n const closest = closestFromList(\n (this.currentValue as number) || this.colorTemperatureTable[0],\n this.colorTemperatureTable,\n );\n let index = this.colorTemperatureTable.indexOf(closest) + 1;\n index = index >= this.colorTemperatureTable.length ? this.colorTemperatureTable.length - 1 : index;\n return this.colorTemperatureTable[index];\n }\n if (alexaValue === -1) {\n // decrease directive\n const closest = closestFromList(\n (this.currentValue as number) || this.colorTemperatureTable[0],\n this.colorTemperatureTable,\n );\n let index = this.colorTemperatureTable.indexOf(closest) - 1;\n index = index < 0 ? 0 : index;\n return this.colorTemperatureTable[index];\n }\n // Convert Kelvin to mireds\n if (isMireds) {\n return Math.round(1000000 / (alexaValue as number));\n }\n return alexaValue as number;\n },\n alexaGetter: function (\n this: PropertiesBase,\n value: ioBroker.StateValue | undefined,\n ): AlexaV3DirectiveValue {\n // Convert Mireds to Kelvin\n if (isMireds) {\n return Math.round(1000000 / (value as number));\n }\n return value as number;\n },\n };\n }\n}\n"]}