iobroker.iot 4.1.2 → 4.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +5 -3
  2. package/admin/assets/{index-6Itc0U48.js → index-CyfkYMpa.js} +85 -85
  3. package/admin/index_m.html +1 -1
  4. package/admin/rules/assets/{index-208Qrr3S.js → index-DBQ_ihVx.js} +83 -83
  5. package/admin/rules/customRuleBlocks.js +2 -2
  6. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js +7 -0
  7. package/build/lib/AlexaSmartHomeV3/Alexa/AlexaResponse.js.map +1 -1
  8. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js +3 -1
  9. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/Base.js.map +1 -1
  10. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.js +38 -0
  11. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/SceneController.js.map +1 -0
  12. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js +2 -0
  13. package/build/lib/AlexaSmartHomeV3/Alexa/Capabilities/index.js.map +1 -1
  14. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Base.js.map +1 -1
  15. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js +67 -14
  16. package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Color.js.map +1 -1
  17. package/build/lib/AlexaSmartHomeV3/Controls/Button.js +74 -0
  18. package/build/lib/AlexaSmartHomeV3/Controls/Button.js.map +1 -0
  19. package/build/lib/AlexaSmartHomeV3/Controls/Control.js +2 -0
  20. package/build/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -1
  21. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js +1 -7
  22. package/build/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -1
  23. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js +8 -5
  24. package/build/lib/AlexaSmartHomeV3/Controls/Hue.js.map +1 -1
  25. package/build/lib/AlexaSmartHomeV3/Controls/Light.js.map +1 -1
  26. package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js +200 -0
  27. package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js.map +1 -0
  28. package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js +210 -0
  29. package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js.map +1 -0
  30. package/build/lib/AlexaSmartHomeV3/Controls/VacuumCleaner.js.map +1 -1
  31. package/build/lib/AlexaSmartHomeV3/Controls/index.js +15 -3
  32. package/build/lib/AlexaSmartHomeV3/Controls/index.js.map +1 -1
  33. package/build/lib/AlexaSmartHomeV3/DeviceManager.js +9 -2
  34. package/build/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -1
  35. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js +287 -0
  36. package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -1
  37. package/build/lib/alexaCustom.js +1 -1
  38. package/build/lib/alexaCustom.js.map +1 -1
  39. package/io-package.json +14 -14
  40. package/package.json +4 -1
@@ -57,6 +57,11 @@ exports.ensureValueInRange = ensureValueInRange;
57
57
  exports.firstLower = firstLower;
58
58
  exports.closestFromList = closestFromList;
59
59
  exports.asEnum = asEnum;
60
+ exports.hal2rgb = hal2rgb;
61
+ exports.hal2rgbw = hal2rgbw;
62
+ exports.rgb2hal = rgb2hal;
63
+ exports.rgbwToHex = rgbwToHex;
64
+ exports.rgbw2hal = rgbw2hal;
60
65
  const node_crypto_1 = require("node:crypto");
61
66
  const AdapterProvider_1 = __importDefault(require("./AdapterProvider"));
62
67
  const type_detector_1 = __importStar(require("@iobroker/type-detector"));
@@ -621,4 +626,286 @@ function asEnum(values) {
621
626
  }
622
627
  return enumeration;
623
628
  }
629
+ function toHex(x) {
630
+ return x.toString(16).padStart(2, '0');
631
+ }
632
+ function to255(x) {
633
+ return Math.round(x * 255);
634
+ }
635
+ /**
636
+ * Converts a color from HAL (Hue, Saturation, Brightness) to RGB hex string
637
+ *
638
+ * @param hal The color in HAL format
639
+ * @param hal.hue The hue (0-360)
640
+ * @param hal.saturation The saturation (0-1)
641
+ * @param hal.brightness The brightness (0-1)
642
+ * @returns The color in RGB hex format (e.g. #ff0000 for red)
643
+ */
644
+ function hal2rgb(hal) {
645
+ const hue = hal.hue;
646
+ const saturation = hal.saturation;
647
+ const brightness = hal.brightness;
648
+ let r;
649
+ let g;
650
+ let b;
651
+ const i = Math.floor(hue / 60) % 6;
652
+ const f = hue / 60 - i;
653
+ const p = brightness * (1 - saturation);
654
+ const q = brightness * (1 - f * saturation);
655
+ const t = brightness * (1 - (1 - f) * saturation);
656
+ switch (i) {
657
+ case 0:
658
+ r = brightness;
659
+ g = t;
660
+ b = p;
661
+ break;
662
+ case 1:
663
+ r = q;
664
+ g = brightness;
665
+ b = p;
666
+ break;
667
+ case 2:
668
+ r = p;
669
+ g = brightness;
670
+ b = t;
671
+ break;
672
+ case 3:
673
+ r = p;
674
+ g = q;
675
+ b = brightness;
676
+ break;
677
+ case 4:
678
+ r = t;
679
+ g = p;
680
+ b = brightness;
681
+ break;
682
+ case 5:
683
+ r = brightness;
684
+ g = p;
685
+ b = q;
686
+ break;
687
+ default:
688
+ r = 0;
689
+ g = 0;
690
+ b = 0;
691
+ }
692
+ return `#${toHex(to255(r))}${toHex(to255(g))}${toHex(to255(b))}`;
693
+ }
694
+ function hal2rgbw(hal) {
695
+ const hue = hal.hue;
696
+ const saturation = hal.saturation;
697
+ const brightness = hal.brightness;
698
+ let r;
699
+ let g;
700
+ let b;
701
+ const i = Math.floor(hue / 60) % 6;
702
+ const f = hue / 60 - i;
703
+ const p = brightness * (1 - saturation);
704
+ const q = brightness * (1 - f * saturation);
705
+ const t = brightness * (1 - (1 - f) * saturation);
706
+ switch (i) {
707
+ case 0:
708
+ r = brightness;
709
+ g = t;
710
+ b = p;
711
+ break;
712
+ case 1:
713
+ r = q;
714
+ g = brightness;
715
+ b = p;
716
+ break;
717
+ case 2:
718
+ r = p;
719
+ g = brightness;
720
+ b = t;
721
+ break;
722
+ case 3:
723
+ r = p;
724
+ g = q;
725
+ b = brightness;
726
+ break;
727
+ case 4:
728
+ r = t;
729
+ g = p;
730
+ b = brightness;
731
+ break;
732
+ case 5:
733
+ r = brightness;
734
+ g = p;
735
+ b = q;
736
+ break;
737
+ default:
738
+ r = 0;
739
+ g = 0;
740
+ b = 0;
741
+ }
742
+ return `#${toHex(to255(r))}${toHex(to255(g))}${toHex(to255(b))}${toHex(to255(255))}`;
743
+ }
744
+ /**
745
+ * Convert an RGB hex string to HAL (Hue, Saturation, Brightness)
746
+ *
747
+ * @param rgb The color in RGB hex format (e.g. #ff0000 for red)
748
+ * @returns The color in HAL format or null on invalid input
749
+ */
750
+ function rgb2hal(rgb) {
751
+ if (!rgb || typeof rgb !== 'string' || !rgb.startsWith('#') || (rgb.length !== 7 && rgb.length !== 4)) {
752
+ return {
753
+ hue: 0,
754
+ saturation: 0,
755
+ brightness: 0,
756
+ };
757
+ }
758
+ let r;
759
+ let g;
760
+ let b;
761
+ if (rgb.length === 7) {
762
+ r = parseInt(rgb.substring(1, 3), 16);
763
+ g = parseInt(rgb.substring(3, 5), 16);
764
+ b = parseInt(rgb.substring(5, 7), 16);
765
+ }
766
+ else {
767
+ r = parseInt(rgb[1] + rgb[1], 16);
768
+ g = parseInt(rgb[2] + rgb[2], 16);
769
+ b = parseInt(rgb[3] + rgb[3], 16);
770
+ }
771
+ r /= 255;
772
+ g /= 255;
773
+ b /= 255;
774
+ const max = Math.max(r, g, b);
775
+ const min = Math.min(r, g, b);
776
+ let h;
777
+ const v = max;
778
+ const d = max - min;
779
+ const s = max === 0 ? 0 : d / max;
780
+ if (max === min) {
781
+ h = 0; // achromatic
782
+ }
783
+ else {
784
+ switch (max) {
785
+ case r:
786
+ h = (g - b) / d + (g < b ? 6 : 0);
787
+ break;
788
+ case g:
789
+ h = (b - r) / d + 2;
790
+ break;
791
+ case b:
792
+ h = (r - g) / d + 4;
793
+ break;
794
+ default:
795
+ h = 0;
796
+ }
797
+ h /= 6;
798
+ }
799
+ return {
800
+ hue: Math.round(h * 360),
801
+ saturation: parseFloat(s.toFixed(2)),
802
+ brightness: parseFloat(v.toFixed(2)),
803
+ };
804
+ }
805
+ /** Convert rgb(w)(1-255,1-255,1-255(,0-1)) to hex string */
806
+ function rgbwToHex(rgbw) {
807
+ if (!rgbw || typeof rgbw !== 'string') {
808
+ return '#00000000';
809
+ }
810
+ if (rgbw.startsWith('#')) {
811
+ return rgbw;
812
+ }
813
+ if (rgbw.startsWith('rgba(')) {
814
+ rgbw = rgbw.substring(5, rgbw.length - 1);
815
+ }
816
+ else if (rgbw.startsWith('rgb(')) {
817
+ rgbw = rgbw.substring(4, rgbw.length - 1);
818
+ }
819
+ const parts = rgbw.split(',');
820
+ if (parts.length < 3 || parts.length > 4) {
821
+ return '#000000';
822
+ }
823
+ let r = parseInt(parts[0].trim(), 10);
824
+ let g = parseInt(parts[1].trim(), 10);
825
+ let b = parseInt(parts[2].trim(), 10);
826
+ let w = parts.length === 4 ? parseFloat(parts[3].trim()) : 1;
827
+ if (isNaN(r) || isNaN(g) || isNaN(b) || isNaN(w)) {
828
+ if (parts.length === 4) {
829
+ return '#00000000';
830
+ }
831
+ return '#000000';
832
+ }
833
+ r = Math.max(0, Math.min(255, r));
834
+ g = Math.max(0, Math.min(255, g));
835
+ b = Math.max(0, Math.min(255, b));
836
+ w = Math.max(0, Math.min(1, w));
837
+ if (parts.length === 3) {
838
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
839
+ }
840
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}${toHex(Math.round(w * 255))}`;
841
+ }
842
+ /**
843
+ * Convert an RGBW hex string to HAL (Hue, Saturation, Brightness)
844
+ *
845
+ * @param rgbw The color in RGB hex format (e.g. #ff0000 for red)
846
+ * @returns The color in HAL format or null on invalid input
847
+ */
848
+ function rgbw2hal(rgbw) {
849
+ if (!rgbw || typeof rgbw !== 'string' || !rgbw.startsWith('#') || (rgbw.length !== 9 && rgbw.length !== 5)) {
850
+ return {
851
+ hue: 0,
852
+ saturation: 0,
853
+ brightness: 0,
854
+ };
855
+ }
856
+ let r;
857
+ let g;
858
+ let b;
859
+ let w;
860
+ if (rgbw.length === 9) {
861
+ r = parseInt(rgbw.substring(1, 3), 16);
862
+ g = parseInt(rgbw.substring(3, 5), 16);
863
+ b = parseInt(rgbw.substring(5, 7), 16);
864
+ w = parseInt(rgbw.substring(7, 9), 16);
865
+ }
866
+ else {
867
+ r = parseInt(rgbw[1] + rgbw[1], 16);
868
+ g = parseInt(rgbw[2] + rgbw[2], 16);
869
+ b = parseInt(rgbw[3] + rgbw[3], 16);
870
+ w = parseInt(rgbw[4] + rgbw[4], 16);
871
+ }
872
+ // remove white from RGB
873
+ // r = Math.max(0, r - w);
874
+ // g = Math.max(0, g - w);
875
+ // b = Math.max(0, b - w);
876
+ r /= 255;
877
+ g /= 255;
878
+ b /= 255;
879
+ w /= 255;
880
+ const max = Math.max(r, g, b);
881
+ const min = Math.min(r, g, b);
882
+ let h;
883
+ const v = Math.max(max, w); // use white channel as brightness if higher
884
+ const d = max - min;
885
+ const s = v === 0 ? 0 : d / v;
886
+ if (max === min) {
887
+ h = 0; // achromatic
888
+ }
889
+ else {
890
+ switch (max) {
891
+ case r:
892
+ h = (g - b) / d + (g < b ? 6 : 0);
893
+ break;
894
+ case g:
895
+ h = (b - r) / d + 2;
896
+ break;
897
+ case b:
898
+ h = (r - g) / d + 4;
899
+ break;
900
+ default:
901
+ h = 0;
902
+ }
903
+ h /= 6;
904
+ }
905
+ return {
906
+ hue: Math.round(h * 360),
907
+ saturation: parseFloat(s.toFixed(2)),
908
+ brightness: parseFloat(v.toFixed(2)),
909
+ };
910
+ }
624
911
  //# sourceMappingURL=Utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/Utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport AdapterProvider from './AdapterProvider';\nimport ChannelDetector, { type DetectOptions, Types } from '@iobroker/type-detector';\nimport type {\n AlexaV3EndpointID,\n IotExternalDetectorState,\n IotExternalPatternControl,\n SmartName,\n SmartNameObject,\n} from '../types';\nimport type { IotAdapterConfig } from '../../types';\nimport roomTranslator from '../../rooms';\nimport functionTranslator from '../../functions';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction onlyValidCharactersAndLength(name: string): string {\n return name.substring(0, 128).replace(/[^.a-zA-Z0-9äÄüÜöÖßÉéÈèÀàÂâÊêÙùÛûÇçÎîËëÏïŸÿÔôŒœãõìòáíóú]+/g, ' ');\n}\n\nfunction isRoom(enumObject: ioBroker.EnumObject): boolean {\n return enumObject?._id?.startsWith('enum.rooms.');\n}\n\nfunction isFunctionality(enumObject: ioBroker.EnumObject): boolean {\n return enumObject?._id?.startsWith('enum.functions.');\n}\n\nasync function allEnums(adapter: ioBroker.Adapter): Promise<ioBroker.EnumObject[]> {\n const result = await adapter.getObjectViewAsync('system', 'enum', {});\n return result.rows.map(row => row.value);\n}\n\nfunction parentOf(id: string): string {\n const parts = (id || '').split('.');\n parts.pop();\n return parts.join('.');\n}\n\nasync function allObjects(adapter: ioBroker.Adapter): Promise<Record<string, ioBroker.Object>> {\n const states = await adapter.getObjectViewAsync('system', 'state', {});\n const channels = await adapter.getObjectViewAsync('system', 'channel', {});\n const devices = await adapter.getObjectViewAsync('system', 'device', {});\n const enums = await adapter.getObjectViewAsync('system', 'enum', {});\n\n return (states.rows as { id: string; value: ioBroker.Object }[])\n .concat(channels.rows)\n .concat(devices.rows)\n .concat(enums.rows)\n .reduce(\n (obj, item) => (\n (obj[item.id] = {\n common: item.value?.common,\n type: item.value?.type,\n } as ioBroker.Object),\n obj\n ),\n {} as Record<string, ioBroker.Object>,\n );\n}\n\nconst SMART_TYPES: { [name: string]: string } = {\n LIGHT: 'light',\n SWITCH: 'socket',\n THERMOSTAT: 'thermostat',\n SMARTPLUG: 'socket',\n SMARTLOCK: 'lock',\n CAMERA: 'camera',\n};\n\nfunction getSmartNameFromObj(\n obj: ioBroker.Object | ioBroker.StateCommon,\n instanceId: string,\n noCommon?: boolean,\n): undefined | false | SmartNameObject {\n if (!obj) {\n return undefined;\n }\n let result: undefined | false | SmartNameObject;\n // If it is a common object\n if (!(obj as ioBroker.StateObject).common) {\n result = (obj as ioBroker.StateCommon).smartName as undefined | false | SmartNameObject;\n } else if (!noCommon) {\n result = (obj as ioBroker.StateObject).common.smartName as undefined | false | SmartNameObject;\n } else {\n const custom = (obj as ioBroker.StateObject).common.custom;\n if (!custom) {\n return undefined;\n }\n result = custom[instanceId] ? custom[instanceId].smartName : undefined;\n }\n if (result && typeof result === 'string') {\n if (result === 'ignore') {\n return false;\n }\n return {\n en: result,\n };\n }\n return result;\n}\n\nasync function functionalitiesAndRooms(\n adapter: ioBroker.Adapter,\n): Promise<[ioBroker.EnumObject[], ioBroker.EnumObject[]]> {\n const enumerations = await allEnums(adapter);\n // skip empty enums (with no members, i.e. states, assigned)\n const notEmptyRoomsAndFunctionalities = enumerations\n .filter(item => {\n const smartName = getSmartNameFromObj(\n item,\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n return smartName !== false;\n })\n .filter(item => item?.common?.members?.length);\n // all enums that are of type 'function'\n const functionalities = notEmptyRoomsAndFunctionalities.filter(item => isFunctionality(item));\n // all enums, that are of type 'room'\n const rooms = notEmptyRoomsAndFunctionalities.filter(item => isRoom(item));\n return [functionalities, rooms];\n}\n\nfunction getChannelId(id: string, objects: Record<string, ioBroker.Object>): string | null | undefined {\n if (objects[id] && objects[id].type === 'channel') {\n return id;\n }\n\n if (objects[id] && objects[id].type === 'state') {\n const channelId = parentOf(id);\n if (objects[channelId] && objects[channelId].type === 'channel') {\n return channelId;\n }\n return null;\n }\n}\n\nfunction getDeviceId(id: string, objects: Record<string, ioBroker.Object>): string | null {\n const channelId = getChannelId(id, objects);\n if (channelId) {\n const deviceId = parentOf(channelId);\n if (objects[deviceId] && (objects[deviceId].type === 'device' || objects[deviceId].type === 'channel')) {\n return deviceId;\n }\n }\n return null;\n}\n\nexport function parseISOString(dateTimeAsISOString: string): Date {\n const [year, month, date, hours, minutes, seconds, ms]: string[] = dateTimeAsISOString.split(/\\D+/);\n return new Date(\n Date.UTC(\n parseInt(year, 10),\n parseInt(month, 10) - 1,\n parseInt(date, 10),\n parseInt(hours, 10),\n parseInt(minutes, 10),\n parseInt(seconds, 10),\n parseInt(ms, 10),\n ),\n );\n}\n\nexport function configuredRangeOrDefault(state: IotExternalDetectorState): {\n min: number | boolean;\n max: number | boolean;\n} {\n if (state.common?.type === 'boolean') {\n return { min: false, max: true };\n }\n const configuredMin = state.common?.min;\n const configuredMax = state.common?.max;\n const min =\n configuredMin === undefined || isNaN(configuredMin) ? 0 : parseFloat(configuredMin as unknown as string);\n const max =\n configuredMax === undefined || isNaN(configuredMax) ? 100 : parseFloat(configuredMax as unknown as string);\n\n return { min, max };\n}\n\nexport function currentHour(): Date {\n const datetime = new Date();\n datetime.setMinutes(0);\n datetime.setSeconds(0);\n return datetime;\n}\n\nexport function isToday(dateTime: Date): boolean {\n const today = new Date();\n return (\n dateTime.getDate() === today.getDate() &&\n dateTime.getMonth() === today.getMonth() &&\n dateTime.getFullYear() === today.getFullYear()\n );\n}\n\nexport function isCurrentHour(dateTime: Date): boolean {\n const now = new Date();\n const diffInHours = Math.abs(now.getTime() - dateTime.getTime()) / 3.6e6;\n return diffInHours < 1;\n}\n\nexport function endpointId(id: string): AlexaV3EndpointID {\n // even more restrictive than Alexa documents\n const regex = /^[A-Za-z0-9\\-_]{1,256}$/g;\n id = id.replace(/\\s/g, '_');\n if (!regex.test(id)) {\n const hash = createHash('sha256').update(id).digest('hex');\n id = `${hash}#${id.replace(/[^A-Za-z0-9\\-_]+/g, '-')}`.substring(0, 256);\n }\n\n return id;\n}\n\nexport function onlyValidCharactersAndLengthForFriendlyName(name: string): string {\n return name.substring(0, 128).replace(/[^.a-zA-Z0-9äÄüÜöÖßÉéÈèÀàÂâÊêÙùÛûÇçÎîËëÏïŸÿÔôŒœãõìòáíóú]+/g, ' ');\n}\n\nexport function stringify(smartName: SmartName, lang: ioBroker.Languages): string {\n if (smartName && typeof smartName === 'object') {\n return smartName[lang] || smartName.en || '';\n }\n if (!smartName) {\n return '';\n }\n return onlyValidCharactersAndLengthForFriendlyName(smartName);\n}\n\nexport function friendlyNameByRoomAndFunctionName(\n control: IotExternalPatternControl,\n lang: ioBroker.Languages,\n): string {\n const config: IotAdapterConfig = AdapterProvider.get().config;\n const funcNameFirst = config.functionFirst;\n let concatenation = config.concatWord;\n let name;\n\n let roomName: ioBroker.StringOrTranslated | undefined = control.room?.common?.name;\n let translateRoomName;\n if (typeof roomName === 'object') {\n // try to translate from EN to any other language\n translateRoomName = lang && lang !== 'en' && !roomName[lang];\n roomName = roomName[lang] || roomName.en || '';\n } else {\n // always try to translate room names provided as a non-object type\n translateRoomName = true;\n }\n\n if (translateRoomName && roomName) {\n roomName = roomTranslator(lang, roomName);\n }\n\n let funcName = control.functionality?.common?.name;\n let translateFunctionalityName;\n if (typeof funcName === 'object') {\n translateFunctionalityName = lang && lang !== 'en' && !funcName[lang];\n funcName = funcName[lang] || funcName.en;\n } else {\n translateFunctionalityName = true;\n }\n if (translateFunctionalityName && funcName) {\n funcName = functionTranslator(lang, funcName);\n }\n\n concatenation = concatenation ? ` ${concatenation} ` : ' ';\n\n name = `${funcNameFirst ? funcName : roomName}${concatenation}${funcNameFirst ? roomName : funcName}`;\n name = name.trim();\n\n return onlyValidCharactersAndLengthForFriendlyName(name);\n}\n\n/**\n * Checks whether the provided value is a valid smart name.\n *\n * @param smartName The value to check\n * @param lang Configured language\n * @returns True if a valid smart name, false - otherwise.\n */\nexport function isValidSmartName(smartName: SmartName | undefined, lang: ioBroker.Languages): boolean {\n let name = smartName;\n if (smartName === false || smartName === 'ignore') {\n return false;\n }\n if (smartName && typeof smartName === 'object') {\n name = smartName[lang] || smartName.en || smartName.de;\n }\n return ![null, undefined, 'ignore', false].includes(name as string);\n}\n\n/**\n * Checks a value for validity or returns a default.\n *\n * @param value The value being checked\n * @param defaultValue A default value if the passed value is not valid\n * @returns The passed value if valid otherwise the default value.\n */\nexport function defaultIfNullOrEmpty<T>(value: T | undefined, defaultValue: T): T {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n value === ''\n ) {\n return defaultValue;\n }\n\n return value;\n}\n\n/**\n * Inspects all objects (states, channels and devices) and tries to identify so-called 'controls'\n *\n * To identify the controls, the ioBroker type detector library is used (https://github.com/ioBroker/ioBroker.type-detector).\n *\n * @param adapter The iot adapter instance\n * @param lang language\n * @returns An array containing the detected controls\n */\nexport async function controls(\n adapter: ioBroker.Adapter,\n lang: ioBroker.Languages,\n): Promise<IotExternalPatternControl[]> {\n // here we collect ids to inspect\n const list: string[] = [];\n\n // fetch all objects (states, channels and devices in terms of iobroker)\n const devicesObject = await allObjects(adapter);\n // fetch all defined rooms and functions (enumerations)\n const [functionalities, rooms] = await functionalitiesAndRooms(adapter);\n\n // every member of a function enumeration is added to the list of ids to inspect\n functionalities.forEach(functionEnumItem => {\n functionEnumItem.common.members?.forEach(id => {\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n\n const objType = devicesObject[id].type;\n if (\n devicesObject[id]?.common &&\n (objType === 'state' || objType === 'channel' || objType === 'device') &&\n !list.includes(id) &&\n smartName !== false // if the device is not disabled\n ) {\n list.push(id);\n }\n });\n });\n\n // a member of a room enumeration is only added if neither its parent (channel) nor its grandparent (device) is in\n rooms.forEach(roomEnumItem => {\n roomEnumItem.common.members?.forEach(id => {\n if (!devicesObject[id]) {\n return;\n }\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n const objType = devicesObject[id].type;\n if (\n devicesObject[id]?.common &&\n (objType === 'state' || objType === 'channel' || objType === 'device') &&\n !list.includes(id) &&\n smartName !== false // if the device is not disabled\n ) {\n const channelId = getChannelId(id, devicesObject);\n if (channelId) {\n if (!list.includes(channelId)) {\n const deviceId = getDeviceId(id, devicesObject);\n if (deviceId) {\n if (!list.includes(deviceId)) {\n list.push(id);\n }\n } else {\n list.push(id);\n }\n }\n } else {\n list.push(id);\n }\n }\n });\n });\n\n // all ids, i.e. ids of all iobroker states/channels/devices\n const keys = Object.keys(devicesObject).sort();\n\n const idsWithSmartName: string[] = [];\n // if a state has got a smart name directly assigned and neither itself nor its channel is in the list, add its id to the inspection list\n // and process it first\n keys.forEach(id => {\n const smartName =\n devicesObject[id] &&\n getSmartNameFromObj(devicesObject[id], adapter.namespace, (adapter.config as IotAdapterConfig).noCommon);\n\n const objType = devicesObject[id].type;\n\n if (\n isValidSmartName(smartName, lang) &&\n devicesObject[id].common &&\n (objType === 'state' || objType === 'channel' || objType === 'device')\n ) {\n idsWithSmartName.push(id);\n }\n });\n\n // collect first all smart names and remove them from the auto-groups\n const detectedControls: IotExternalPatternControl[] = [];\n const detector = new ChannelDetector();\n\n const patterns = ChannelDetector.getPatterns();\n // process states with defined smartName\n for (let s = 0; s < idsWithSmartName.length; s++) {\n const id = idsWithSmartName[s];\n const common = devicesObject[id].common;\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n ) as SmartNameObject;\n\n // try to convert the state to typeDetector format\n // \"smartName\": {\n // \"de\": \"Rote Lampe\",\n // \"smartType\": \"LIGHT\", // optional\n // \"byON\": 80 // optional\n // }\n if (!smartName.smartType) {\n // by default,\n // all booleans are sockets\n // all numbers are dimmer\n // string is not possible to control\n if (common.type === 'boolean' || common.type === 'mixed') {\n // we will write boolean\n smartName.smartType = 'socket';\n } else if (common.type === 'number') {\n smartName.smartType = 'dimmer';\n } else {\n smartName.smartType = 'socket';\n }\n }\n // convert alexa2 smartType to alexa 3\n if (SMART_TYPES[smartName.smartType]) {\n smartName.smartType = SMART_TYPES[smartName.smartType];\n }\n // try to simulate typeDetector format\n if (patterns[smartName.smartType]) {\n const control: IotExternalPatternControl = JSON.parse(JSON.stringify(patterns[smartName.smartType]));\n // find first required\n const state = control.states.find(state => state.required);\n if (state) {\n state.id = id;\n // process control\n // remove all unassigned control register\n control.states = control.states.filter(s => s.id);\n\n // take all smartNames if any\n control.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n s.common = {\n min: devicesObject[s.id]?.common?.min,\n max: devicesObject[s.id]?.common?.max,\n type: devicesObject[s.id]?.common?.type,\n states: devicesObject[s.id]?.common?.states,\n role: devicesObject[s.id]?.common?.role,\n name: devicesObject[s.id]?.common?.name,\n };\n });\n\n devicesObject[id].common.smartName = smartName;\n\n control.object = {\n id,\n type: devicesObject[id].type,\n common: devicesObject[id].common,\n autoDetected: false,\n toggle: smartName?.toggle,\n };\n\n // remove id from the groups\n let pos = list.indexOf(id);\n if (pos !== -1) {\n list.splice(pos, 1);\n }\n const channelId = getChannelId(id, devicesObject);\n if (channelId) {\n pos = list.indexOf(channelId);\n if (pos !== -1) {\n list.splice(pos, 1);\n }\n }\n\n const name = smartName[lang] || smartName.en || smartName.de;\n control.groupNames = name?.split(',').map(n => n.trim()) || [];\n\n adapter.log.debug(`[ALEXA3] added ${id} with smartName as \"${smartName.smartType}\"`);\n detectedControls.push(control);\n } else {\n // ignored\n adapter.log.debug(\n `[ALEXA3] Ignored state ${id} with smartName ${JSON.stringify(smartName)} and type ${common.type}`,\n );\n }\n } else {\n // ignored\n adapter.log.debug(\n `[ALEXA3] Ignored state ${id} with smartName ${JSON.stringify(smartName)} and type ${common.type}`,\n );\n }\n }\n\n // initialize iobroker type detector\n const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\n const options: DetectOptions = {\n objects: devicesObject,\n _keysOptional: keys,\n _usedIdsOptional: usedIds,\n ignoreIndicators,\n excludedTypes,\n id: '', // this will be set for each id in the list\n };\n\n // go other the list of IDs to inspect and collect the detected controls\n list.forEach(id => {\n options.id = id;\n const controls = detector.detect(options);\n controls?.forEach(control => {\n const iotControl: IotExternalPatternControl = control as IotExternalPatternControl;\n\n // if any detected state has an ID, we can use this control\n if (iotControl.states.find(state => state.id)) {\n // console.log(`In ${id} was detected \"${control.type}\" with the following states:`);\n\n // remove all unassigned control register\n iotControl.states = iotControl.states.filter(s => s.id);\n\n // take all smartNames if any\n iotControl.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n s.common = {\n min: devicesObject[s.id]?.common?.min,\n max: devicesObject[s.id]?.common?.max,\n type: devicesObject[s.id]?.common?.type,\n states: devicesObject[s.id]?.common?.states,\n role: devicesObject[s.id]?.common?.role,\n name: devicesObject[s.id]?.common?.name,\n };\n });\n\n // find out the room the found control is in\n const room = rooms.find(room => room?.common?.members?.includes(id));\n\n // find out the functionality the found control assigned to\n const functionality = functionalities.find(functionality =>\n functionality?.common?.members?.includes(id),\n );\n\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n iotControl.object = {\n id,\n type: devicesObject[id].type,\n common: {\n min: devicesObject[id].common?.min,\n max: devicesObject[id].common?.max,\n type: devicesObject[id].common?.type,\n states: devicesObject[id].common?.states,\n role: devicesObject[id].common?.role,\n name: devicesObject[id].common?.name,\n smartName,\n },\n autoDetected: true,\n toggle: smartName && typeof smartName === 'object' ? smartName.toggle : undefined,\n };\n\n iotControl.room = room\n ? {\n id: room._id,\n common: room.common,\n }\n : undefined;\n\n iotControl.functionality = functionality\n ? {\n id: functionality._id,\n common: functionality.common,\n }\n : undefined;\n\n detectedControls.push(iotControl);\n }\n });\n });\n\n return detectedControls;\n}\n\n/**\n * Normalizes any provided value with observed min and max to the range 0..100\n *\n * @param value value to be normalized\n * @param min min observed (possible) value\n * @param max max observed (possible) value\n * @returns Normalized value in the range 0..100 or undefined on invalid input\n */\nexport function normalize_0_100(value: number, min: number, max: number): number | undefined {\n return min >= max || value < min || value > max ? undefined : Math.round(((value - min) / (max - min)) * 100);\n}\n\n/**\n * Denormalizes any provided value from range 0..100 to the min..max range\n *\n * @param normalized normalized value\n * @param min min observed (possible) value\n * @param max max observed (possible) value\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_100(normalized: number, min: number, max: number): number | undefined {\n return min >= max || normalized < 0 || normalized > 100\n ? undefined\n : Math.round((normalized / 100) * (max - min) + min);\n}\n\n/**\n * Returns distinct objects in a list based on values of the provided property name\n *\n * @param list - list of objects\n * @param propertyName - name of the property to build distinct values on\n * @param combineValues - if the values should be combined and not just overwritten\n * @returns List containing at most one element per property value\n */\nexport function distinctByPropertyName<T extends Record<string, any>>(\n list: T[],\n propertyName: keyof T,\n combineValues?: boolean,\n): T[] {\n const map = new Map<T[keyof T], T>();\n for (const item of list) {\n const key = item[propertyName];\n if (combineValues && map.has(key)) {\n const existing = map.get(key)!;\n if (existing.value === 'ON' || existing.value === 'OFF') {\n if ((item as any).value === 'ON') {\n (existing as any).value = (item as any).value;\n }\n } else if (isFinite((existing as any).value) && isFinite((item as any).value)) {\n (existing as any).value = Math.max((existing as any).value, (item as any).value);\n }\n continue;\n }\n map.set(key, item);\n }\n return Array.from(map.values());\n}\n\nexport function className(thisToString: string): string {\n const classNameRegEx = /\\S+\\s+([a-zA-Z_$][0-9a-zA-Z_$]*)/;\n const result = classNameRegEx.exec(thisToString);\n return result?.[1] || 'UnknownClass';\n}\n\n/**\n * Updates the provided value if required to fit it into the range 0..100\n */\nexport function ensureValueInRange_0_100(value: number): number {\n return ensureValueInRange(value, 0, 100);\n}\n\n/**\n * Updates the provided value if required to fit it into the range min..max\n */\nexport function ensureValueInRange(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function firstLower(input: string): string {\n if (!input || typeof input !== 'string') {\n return input;\n }\n return input[0].toLowerCase() + input.slice(1);\n}\n\nexport function closestFromList(target: number, list: number[]): number {\n return list.reduce((prev, curr) => (Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev));\n}\n\nexport function asEnum(values: string[]): Record<string, number | string> {\n const enumeration: Record<string, number | string> = {};\n for (let i = 0; i < values.length; i++) {\n enumeration[i] = values[i];\n enumeration[values[i]] = i;\n }\n return enumeration;\n}\n"]}
1
+ {"version":3,"file":"Utils.js","sourceRoot":"","sources":["../../../../src/lib/AlexaSmartHomeV3/Helpers/Utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport AdapterProvider from './AdapterProvider';\nimport ChannelDetector, { type DetectOptions, Types } from '@iobroker/type-detector';\nimport type {\n AlexaV3EndpointID,\n IotExternalDetectorState,\n IotExternalPatternControl,\n SmartName,\n SmartNameObject,\n} from '../types';\nimport type { IotAdapterConfig } from '../../types';\nimport roomTranslator from '../../rooms';\nimport functionTranslator from '../../functions';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction onlyValidCharactersAndLength(name: string): string {\n return name.substring(0, 128).replace(/[^.a-zA-Z0-9äÄüÜöÖßÉéÈèÀàÂâÊêÙùÛûÇçÎîËëÏïŸÿÔôŒœãõìòáíóú]+/g, ' ');\n}\n\nfunction isRoom(enumObject: ioBroker.EnumObject): boolean {\n return enumObject?._id?.startsWith('enum.rooms.');\n}\n\nfunction isFunctionality(enumObject: ioBroker.EnumObject): boolean {\n return enumObject?._id?.startsWith('enum.functions.');\n}\n\nasync function allEnums(adapter: ioBroker.Adapter): Promise<ioBroker.EnumObject[]> {\n const result = await adapter.getObjectViewAsync('system', 'enum', {});\n return result.rows.map(row => row.value);\n}\n\nfunction parentOf(id: string): string {\n const parts = (id || '').split('.');\n parts.pop();\n return parts.join('.');\n}\n\nasync function allObjects(adapter: ioBroker.Adapter): Promise<Record<string, ioBroker.Object>> {\n const states = await adapter.getObjectViewAsync('system', 'state', {});\n const channels = await adapter.getObjectViewAsync('system', 'channel', {});\n const devices = await adapter.getObjectViewAsync('system', 'device', {});\n const enums = await adapter.getObjectViewAsync('system', 'enum', {});\n\n return (states.rows as { id: string; value: ioBroker.Object }[])\n .concat(channels.rows)\n .concat(devices.rows)\n .concat(enums.rows)\n .reduce(\n (obj, item) => (\n (obj[item.id] = {\n common: item.value?.common,\n type: item.value?.type,\n } as ioBroker.Object),\n obj\n ),\n {} as Record<string, ioBroker.Object>,\n );\n}\n\nconst SMART_TYPES: { [name: string]: string } = {\n LIGHT: 'light',\n SWITCH: 'socket',\n THERMOSTAT: 'thermostat',\n SMARTPLUG: 'socket',\n SMARTLOCK: 'lock',\n CAMERA: 'camera',\n};\n\nfunction getSmartNameFromObj(\n obj: ioBroker.Object | ioBroker.StateCommon,\n instanceId: string,\n noCommon?: boolean,\n): undefined | false | SmartNameObject {\n if (!obj) {\n return undefined;\n }\n let result: undefined | false | SmartNameObject;\n // If it is a common object\n if (!(obj as ioBroker.StateObject).common) {\n result = (obj as ioBroker.StateCommon).smartName as undefined | false | SmartNameObject;\n } else if (!noCommon) {\n result = (obj as ioBroker.StateObject).common.smartName as undefined | false | SmartNameObject;\n } else {\n const custom = (obj as ioBroker.StateObject).common.custom;\n if (!custom) {\n return undefined;\n }\n result = custom[instanceId] ? custom[instanceId].smartName : undefined;\n }\n if (result && typeof result === 'string') {\n if (result === 'ignore') {\n return false;\n }\n return {\n en: result,\n };\n }\n return result;\n}\n\nasync function functionalitiesAndRooms(\n adapter: ioBroker.Adapter,\n): Promise<[ioBroker.EnumObject[], ioBroker.EnumObject[]]> {\n const enumerations = await allEnums(adapter);\n // skip empty enums (with no members, i.e. states, assigned)\n const notEmptyRoomsAndFunctionalities = enumerations\n .filter(item => {\n const smartName = getSmartNameFromObj(\n item,\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n return smartName !== false;\n })\n .filter(item => item?.common?.members?.length);\n // all enums that are of type 'function'\n const functionalities = notEmptyRoomsAndFunctionalities.filter(item => isFunctionality(item));\n // all enums, that are of type 'room'\n const rooms = notEmptyRoomsAndFunctionalities.filter(item => isRoom(item));\n return [functionalities, rooms];\n}\n\nfunction getChannelId(id: string, objects: Record<string, ioBroker.Object>): string | null | undefined {\n if (objects[id] && objects[id].type === 'channel') {\n return id;\n }\n\n if (objects[id] && objects[id].type === 'state') {\n const channelId = parentOf(id);\n if (objects[channelId] && objects[channelId].type === 'channel') {\n return channelId;\n }\n return null;\n }\n}\n\nfunction getDeviceId(id: string, objects: Record<string, ioBroker.Object>): string | null {\n const channelId = getChannelId(id, objects);\n if (channelId) {\n const deviceId = parentOf(channelId);\n if (objects[deviceId] && (objects[deviceId].type === 'device' || objects[deviceId].type === 'channel')) {\n return deviceId;\n }\n }\n return null;\n}\n\nexport function parseISOString(dateTimeAsISOString: string): Date {\n const [year, month, date, hours, minutes, seconds, ms]: string[] = dateTimeAsISOString.split(/\\D+/);\n return new Date(\n Date.UTC(\n parseInt(year, 10),\n parseInt(month, 10) - 1,\n parseInt(date, 10),\n parseInt(hours, 10),\n parseInt(minutes, 10),\n parseInt(seconds, 10),\n parseInt(ms, 10),\n ),\n );\n}\n\nexport function configuredRangeOrDefault(state: IotExternalDetectorState): {\n min: number | boolean;\n max: number | boolean;\n} {\n if (state.common?.type === 'boolean') {\n return { min: false, max: true };\n }\n const configuredMin = state.common?.min;\n const configuredMax = state.common?.max;\n const min =\n configuredMin === undefined || isNaN(configuredMin) ? 0 : parseFloat(configuredMin as unknown as string);\n const max =\n configuredMax === undefined || isNaN(configuredMax) ? 100 : parseFloat(configuredMax as unknown as string);\n\n return { min, max };\n}\n\nexport function currentHour(): Date {\n const datetime = new Date();\n datetime.setMinutes(0);\n datetime.setSeconds(0);\n return datetime;\n}\n\nexport function isToday(dateTime: Date): boolean {\n const today = new Date();\n return (\n dateTime.getDate() === today.getDate() &&\n dateTime.getMonth() === today.getMonth() &&\n dateTime.getFullYear() === today.getFullYear()\n );\n}\n\nexport function isCurrentHour(dateTime: Date): boolean {\n const now = new Date();\n const diffInHours = Math.abs(now.getTime() - dateTime.getTime()) / 3.6e6;\n return diffInHours < 1;\n}\n\nexport function endpointId(id: string): AlexaV3EndpointID {\n // even more restrictive than Alexa documents\n const regex = /^[A-Za-z0-9\\-_]{1,256}$/g;\n id = id.replace(/\\s/g, '_');\n if (!regex.test(id)) {\n const hash = createHash('sha256').update(id).digest('hex');\n id = `${hash}#${id.replace(/[^A-Za-z0-9\\-_]+/g, '-')}`.substring(0, 256);\n }\n\n return id;\n}\n\nexport function onlyValidCharactersAndLengthForFriendlyName(name: string): string {\n return name.substring(0, 128).replace(/[^.a-zA-Z0-9äÄüÜöÖßÉéÈèÀàÂâÊêÙùÛûÇçÎîËëÏïŸÿÔôŒœãõìòáíóú]+/g, ' ');\n}\n\nexport function stringify(smartName: SmartName, lang: ioBroker.Languages): string {\n if (smartName && typeof smartName === 'object') {\n return smartName[lang] || smartName.en || '';\n }\n if (!smartName) {\n return '';\n }\n return onlyValidCharactersAndLengthForFriendlyName(smartName);\n}\n\nexport function friendlyNameByRoomAndFunctionName(\n control: IotExternalPatternControl,\n lang: ioBroker.Languages,\n): string {\n const config: IotAdapterConfig = AdapterProvider.get().config;\n const funcNameFirst = config.functionFirst;\n let concatenation = config.concatWord;\n let name;\n\n let roomName: ioBroker.StringOrTranslated | undefined = control.room?.common?.name;\n let translateRoomName;\n if (typeof roomName === 'object') {\n // try to translate from EN to any other language\n translateRoomName = lang && lang !== 'en' && !roomName[lang];\n roomName = roomName[lang] || roomName.en || '';\n } else {\n // always try to translate room names provided as a non-object type\n translateRoomName = true;\n }\n\n if (translateRoomName && roomName) {\n roomName = roomTranslator(lang, roomName);\n }\n\n let funcName = control.functionality?.common?.name;\n let translateFunctionalityName;\n if (typeof funcName === 'object') {\n translateFunctionalityName = lang && lang !== 'en' && !funcName[lang];\n funcName = funcName[lang] || funcName.en;\n } else {\n translateFunctionalityName = true;\n }\n if (translateFunctionalityName && funcName) {\n funcName = functionTranslator(lang, funcName);\n }\n\n concatenation = concatenation ? ` ${concatenation} ` : ' ';\n\n name = `${funcNameFirst ? funcName : roomName}${concatenation}${funcNameFirst ? roomName : funcName}`;\n name = name.trim();\n\n return onlyValidCharactersAndLengthForFriendlyName(name);\n}\n\n/**\n * Checks whether the provided value is a valid smart name.\n *\n * @param smartName The value to check\n * @param lang Configured language\n * @returns True if a valid smart name, false - otherwise.\n */\nexport function isValidSmartName(smartName: SmartName | undefined, lang: ioBroker.Languages): boolean {\n let name = smartName;\n if (smartName === false || smartName === 'ignore') {\n return false;\n }\n if (smartName && typeof smartName === 'object') {\n name = smartName[lang] || smartName.en || smartName.de;\n }\n return ![null, undefined, 'ignore', false].includes(name as string);\n}\n\n/**\n * Checks a value for validity or returns a default.\n *\n * @param value The value being checked\n * @param defaultValue A default value if the passed value is not valid\n * @returns The passed value if valid otherwise the default value.\n */\nexport function defaultIfNullOrEmpty<T>(value: T | undefined, defaultValue: T): T {\n if (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n value === ''\n ) {\n return defaultValue;\n }\n\n return value;\n}\n\n/**\n * Inspects all objects (states, channels and devices) and tries to identify so-called 'controls'\n *\n * To identify the controls, the ioBroker type detector library is used (https://github.com/ioBroker/ioBroker.type-detector).\n *\n * @param adapter The iot adapter instance\n * @param lang language\n * @returns An array containing the detected controls\n */\nexport async function controls(\n adapter: ioBroker.Adapter,\n lang: ioBroker.Languages,\n): Promise<IotExternalPatternControl[]> {\n // here we collect ids to inspect\n const list: string[] = [];\n\n // fetch all objects (states, channels and devices in terms of iobroker)\n const devicesObject = await allObjects(adapter);\n // fetch all defined rooms and functions (enumerations)\n const [functionalities, rooms] = await functionalitiesAndRooms(adapter);\n\n // every member of a function enumeration is added to the list of ids to inspect\n functionalities.forEach(functionEnumItem => {\n functionEnumItem.common.members?.forEach(id => {\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n\n const objType = devicesObject[id].type;\n if (\n devicesObject[id]?.common &&\n (objType === 'state' || objType === 'channel' || objType === 'device') &&\n !list.includes(id) &&\n smartName !== false // if the device is not disabled\n ) {\n list.push(id);\n }\n });\n });\n\n // a member of a room enumeration is only added if neither its parent (channel) nor its grandparent (device) is in\n rooms.forEach(roomEnumItem => {\n roomEnumItem.common.members?.forEach(id => {\n if (!devicesObject[id]) {\n return;\n }\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n const objType = devicesObject[id].type;\n if (\n devicesObject[id]?.common &&\n (objType === 'state' || objType === 'channel' || objType === 'device') &&\n !list.includes(id) &&\n smartName !== false // if the device is not disabled\n ) {\n const channelId = getChannelId(id, devicesObject);\n if (channelId) {\n if (!list.includes(channelId)) {\n const deviceId = getDeviceId(id, devicesObject);\n if (deviceId) {\n if (!list.includes(deviceId)) {\n list.push(id);\n }\n } else {\n list.push(id);\n }\n }\n } else {\n list.push(id);\n }\n }\n });\n });\n\n // all ids, i.e. ids of all iobroker states/channels/devices\n const keys = Object.keys(devicesObject).sort();\n\n const idsWithSmartName: string[] = [];\n // if a state has got a smart name directly assigned and neither itself nor its channel is in the list, add its id to the inspection list\n // and process it first\n keys.forEach(id => {\n const smartName =\n devicesObject[id] &&\n getSmartNameFromObj(devicesObject[id], adapter.namespace, (adapter.config as IotAdapterConfig).noCommon);\n\n const objType = devicesObject[id].type;\n\n if (\n isValidSmartName(smartName, lang) &&\n devicesObject[id].common &&\n (objType === 'state' || objType === 'channel' || objType === 'device')\n ) {\n idsWithSmartName.push(id);\n }\n });\n\n // collect first all smart names and remove them from the auto-groups\n const detectedControls: IotExternalPatternControl[] = [];\n const detector = new ChannelDetector();\n\n const patterns = ChannelDetector.getPatterns();\n // process states with defined smartName\n for (let s = 0; s < idsWithSmartName.length; s++) {\n const id = idsWithSmartName[s];\n const common = devicesObject[id].common;\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n ) as SmartNameObject;\n\n // try to convert the state to typeDetector format\n // \"smartName\": {\n // \"de\": \"Rote Lampe\",\n // \"smartType\": \"LIGHT\", // optional\n // \"byON\": 80 // optional\n // }\n if (!smartName.smartType) {\n // by default,\n // all booleans are sockets\n // all numbers are dimmer\n // string is not possible to control\n if (common.type === 'boolean' || common.type === 'mixed') {\n // we will write boolean\n smartName.smartType = 'socket';\n } else if (common.type === 'number') {\n smartName.smartType = 'dimmer';\n } else {\n smartName.smartType = 'socket';\n }\n }\n // convert alexa2 smartType to alexa 3\n if (SMART_TYPES[smartName.smartType]) {\n smartName.smartType = SMART_TYPES[smartName.smartType];\n }\n // try to simulate typeDetector format\n if (patterns[smartName.smartType]) {\n const control: IotExternalPatternControl = JSON.parse(JSON.stringify(patterns[smartName.smartType]));\n // find first required\n const state = control.states.find(state => state.required);\n if (state) {\n state.id = id;\n // process control\n // remove all unassigned control register\n control.states = control.states.filter(s => s.id);\n\n // take all smartNames if any\n control.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n s.common = {\n min: devicesObject[s.id]?.common?.min,\n max: devicesObject[s.id]?.common?.max,\n type: devicesObject[s.id]?.common?.type,\n states: devicesObject[s.id]?.common?.states,\n role: devicesObject[s.id]?.common?.role,\n name: devicesObject[s.id]?.common?.name,\n };\n });\n\n devicesObject[id].common.smartName = smartName;\n\n control.object = {\n id,\n type: devicesObject[id].type,\n common: devicesObject[id].common,\n autoDetected: false,\n toggle: smartName?.toggle,\n };\n\n // remove id from the groups\n let pos = list.indexOf(id);\n if (pos !== -1) {\n list.splice(pos, 1);\n }\n const channelId = getChannelId(id, devicesObject);\n if (channelId) {\n pos = list.indexOf(channelId);\n if (pos !== -1) {\n list.splice(pos, 1);\n }\n }\n\n const name = smartName[lang] || smartName.en || smartName.de;\n control.groupNames = name?.split(',').map(n => n.trim()) || [];\n\n adapter.log.debug(`[ALEXA3] added ${id} with smartName as \"${smartName.smartType}\"`);\n detectedControls.push(control);\n } else {\n // ignored\n adapter.log.debug(\n `[ALEXA3] Ignored state ${id} with smartName ${JSON.stringify(smartName)} and type ${common.type}`,\n );\n }\n } else {\n // ignored\n adapter.log.debug(\n `[ALEXA3] Ignored state ${id} with smartName ${JSON.stringify(smartName)} and type ${common.type}`,\n );\n }\n }\n\n // initialize iobroker type detector\n const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\n const options: DetectOptions = {\n objects: devicesObject,\n _keysOptional: keys,\n _usedIdsOptional: usedIds,\n ignoreIndicators,\n excludedTypes,\n id: '', // this will be set for each id in the list\n };\n\n // go other the list of IDs to inspect and collect the detected controls\n list.forEach(id => {\n options.id = id;\n const controls = detector.detect(options);\n controls?.forEach(control => {\n const iotControl: IotExternalPatternControl = control as IotExternalPatternControl;\n\n // if any detected state has an ID, we can use this control\n if (iotControl.states.find(state => state.id)) {\n // console.log(`In ${id} was detected \"${control.type}\" with the following states:`);\n\n // remove all unassigned control register\n iotControl.states = iotControl.states.filter(s => s.id);\n\n // take all smartNames if any\n iotControl.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n s.common = {\n min: devicesObject[s.id]?.common?.min,\n max: devicesObject[s.id]?.common?.max,\n type: devicesObject[s.id]?.common?.type,\n states: devicesObject[s.id]?.common?.states,\n role: devicesObject[s.id]?.common?.role,\n name: devicesObject[s.id]?.common?.name,\n };\n });\n\n // find out the room the found control is in\n const room = rooms.find(room => room?.common?.members?.includes(id));\n\n // find out the functionality the found control assigned to\n const functionality = functionalities.find(functionality =>\n functionality?.common?.members?.includes(id),\n );\n\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n iotControl.object = {\n id,\n type: devicesObject[id].type,\n common: {\n min: devicesObject[id].common?.min,\n max: devicesObject[id].common?.max,\n type: devicesObject[id].common?.type,\n states: devicesObject[id].common?.states,\n role: devicesObject[id].common?.role,\n name: devicesObject[id].common?.name,\n smartName,\n },\n autoDetected: true,\n toggle: smartName && typeof smartName === 'object' ? smartName.toggle : undefined,\n };\n\n iotControl.room = room\n ? {\n id: room._id,\n common: room.common,\n }\n : undefined;\n\n iotControl.functionality = functionality\n ? {\n id: functionality._id,\n common: functionality.common,\n }\n : undefined;\n\n detectedControls.push(iotControl);\n }\n });\n });\n\n return detectedControls;\n}\n\n/**\n * Normalizes any provided value with observed min and max to the range 0..100\n *\n * @param value value to be normalized\n * @param min min observed (possible) value\n * @param max max observed (possible) value\n * @returns Normalized value in the range 0..100 or undefined on invalid input\n */\nexport function normalize_0_100(value: number, min: number, max: number): number | undefined {\n return min >= max || value < min || value > max ? undefined : Math.round(((value - min) / (max - min)) * 100);\n}\n\n/**\n * Denormalizes any provided value from range 0..100 to the min..max range\n *\n * @param normalized normalized value\n * @param min min observed (possible) value\n * @param max max observed (possible) value\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_100(normalized: number, min: number, max: number): number | undefined {\n return min >= max || normalized < 0 || normalized > 100\n ? undefined\n : Math.round((normalized / 100) * (max - min) + min);\n}\n\n/**\n * Returns distinct objects in a list based on values of the provided property name\n *\n * @param list - list of objects\n * @param propertyName - name of the property to build distinct values on\n * @param combineValues - if the values should be combined and not just overwritten\n * @returns List containing at most one element per property value\n */\nexport function distinctByPropertyName<T extends Record<string, any>>(\n list: T[],\n propertyName: keyof T,\n combineValues?: boolean,\n): T[] {\n const map = new Map<T[keyof T], T>();\n for (const item of list) {\n const key = item[propertyName];\n if (combineValues && map.has(key)) {\n const existing = map.get(key)!;\n if (existing.value === 'ON' || existing.value === 'OFF') {\n if ((item as any).value === 'ON') {\n (existing as any).value = (item as any).value;\n }\n } else if (isFinite((existing as any).value) && isFinite((item as any).value)) {\n (existing as any).value = Math.max((existing as any).value, (item as any).value);\n }\n continue;\n }\n map.set(key, item);\n }\n return Array.from(map.values());\n}\n\nexport function className(thisToString: string): string {\n const classNameRegEx = /\\S+\\s+([a-zA-Z_$][0-9a-zA-Z_$]*)/;\n const result = classNameRegEx.exec(thisToString);\n return result?.[1] || 'UnknownClass';\n}\n\n/**\n * Updates the provided value if required to fit it into the range 0..100\n */\nexport function ensureValueInRange_0_100(value: number): number {\n return ensureValueInRange(value, 0, 100);\n}\n\n/**\n * Updates the provided value if required to fit it into the range min..max\n */\nexport function ensureValueInRange(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function firstLower(input: string): string {\n if (!input || typeof input !== 'string') {\n return input;\n }\n return input[0].toLowerCase() + input.slice(1);\n}\n\nexport function closestFromList(target: number, list: number[]): number {\n return list.reduce((prev, curr) => (Math.abs(curr - target) < Math.abs(prev - target) ? curr : prev));\n}\n\nexport function asEnum(values: string[]): Record<string, number | string> {\n const enumeration: Record<string, number | string> = {};\n for (let i = 0; i < values.length; i++) {\n enumeration[i] = values[i];\n enumeration[values[i]] = i;\n }\n return enumeration;\n}\n\nfunction toHex(x: number): string {\n return x.toString(16).padStart(2, '0');\n}\nfunction to255(x: number): number {\n return Math.round(x * 255);\n}\n\n/**\n * Converts a color from HAL (Hue, Saturation, Brightness) to RGB hex string\n *\n * @param hal The color in HAL format\n * @param hal.hue The hue (0-360)\n * @param hal.saturation The saturation (0-1)\n * @param hal.brightness The brightness (0-1)\n * @returns The color in RGB hex format (e.g. #ff0000 for red)\n */\nexport function hal2rgb(hal: { hue: number; saturation: number; brightness: number }): string {\n const hue = hal.hue;\n const saturation = hal.saturation;\n const brightness = hal.brightness;\n\n let r: number;\n let g: number;\n let b: number;\n\n const i = Math.floor(hue / 60) % 6;\n const f = hue / 60 - i;\n const p = brightness * (1 - saturation);\n const q = brightness * (1 - f * saturation);\n const t = brightness * (1 - (1 - f) * saturation);\n\n switch (i) {\n case 0:\n r = brightness;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = brightness;\n b = p;\n break;\n case 2:\n r = p;\n g = brightness;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = brightness;\n break;\n case 4:\n r = t;\n g = p;\n b = brightness;\n break;\n case 5:\n r = brightness;\n g = p;\n b = q;\n break;\n default:\n r = 0;\n g = 0;\n b = 0;\n }\n\n return `#${toHex(to255(r))}${toHex(to255(g))}${toHex(to255(b))}`;\n}\n\nexport function hal2rgbw(hal: { hue: number; saturation: number; brightness: number }): string {\n const hue = hal.hue;\n const saturation = hal.saturation;\n const brightness = hal.brightness;\n\n let r: number;\n let g: number;\n let b: number;\n\n const i = Math.floor(hue / 60) % 6;\n const f = hue / 60 - i;\n const p = brightness * (1 - saturation);\n const q = brightness * (1 - f * saturation);\n const t = brightness * (1 - (1 - f) * saturation);\n\n switch (i) {\n case 0:\n r = brightness;\n g = t;\n b = p;\n break;\n case 1:\n r = q;\n g = brightness;\n b = p;\n break;\n case 2:\n r = p;\n g = brightness;\n b = t;\n break;\n case 3:\n r = p;\n g = q;\n b = brightness;\n break;\n case 4:\n r = t;\n g = p;\n b = brightness;\n break;\n case 5:\n r = brightness;\n g = p;\n b = q;\n break;\n default:\n r = 0;\n g = 0;\n b = 0;\n }\n\n return `#${toHex(to255(r))}${toHex(to255(g))}${toHex(to255(b))}${toHex(to255(255))}`;\n}\n\n/**\n * Convert an RGB hex string to HAL (Hue, Saturation, Brightness)\n *\n * @param rgb The color in RGB hex format (e.g. #ff0000 for red)\n * @returns The color in HAL format or null on invalid input\n */\nexport function rgb2hal(rgb: string): { hue: number; saturation: number; brightness: number } {\n if (!rgb || typeof rgb !== 'string' || !rgb.startsWith('#') || (rgb.length !== 7 && rgb.length !== 4)) {\n return {\n hue: 0,\n saturation: 0,\n brightness: 0,\n };\n }\n\n let r: number;\n let g: number;\n let b: number;\n\n if (rgb.length === 7) {\n r = parseInt(rgb.substring(1, 3), 16);\n g = parseInt(rgb.substring(3, 5), 16);\n b = parseInt(rgb.substring(5, 7), 16);\n } else {\n r = parseInt(rgb[1] + rgb[1], 16);\n g = parseInt(rgb[2] + rgb[2], 16);\n b = parseInt(rgb[3] + rgb[3], 16);\n }\n\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h: number;\n const v = max;\n\n const d = max - min;\n const s = max === 0 ? 0 : d / max;\n\n if (max === min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n h = 0;\n }\n h /= 6;\n }\n\n return {\n hue: Math.round(h * 360),\n saturation: parseFloat(s.toFixed(2)),\n brightness: parseFloat(v.toFixed(2)),\n };\n}\n\n/** Convert rgb(w)(1-255,1-255,1-255(,0-1)) to hex string */\nexport function rgbwToHex(rgbw: string): string {\n if (!rgbw || typeof rgbw !== 'string') {\n return '#00000000';\n }\n if (rgbw.startsWith('#')) {\n return rgbw;\n }\n if (rgbw.startsWith('rgba(')) {\n rgbw = rgbw.substring(5, rgbw.length - 1);\n } else if (rgbw.startsWith('rgb(')) {\n rgbw = rgbw.substring(4, rgbw.length - 1);\n }\n const parts = rgbw.split(',');\n if (parts.length < 3 || parts.length > 4) {\n return '#000000';\n }\n let r = parseInt(parts[0].trim(), 10);\n let g = parseInt(parts[1].trim(), 10);\n let b = parseInt(parts[2].trim(), 10);\n let w = parts.length === 4 ? parseFloat(parts[3].trim()) : 1;\n\n if (isNaN(r) || isNaN(g) || isNaN(b) || isNaN(w)) {\n if (parts.length === 4) {\n return '#00000000';\n }\n return '#000000';\n }\n r = Math.max(0, Math.min(255, r));\n g = Math.max(0, Math.min(255, g));\n b = Math.max(0, Math.min(255, b));\n w = Math.max(0, Math.min(1, w));\n\n if (parts.length === 3) {\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n }\n return `#${toHex(r)}${toHex(g)}${toHex(b)}${toHex(Math.round(w * 255))}`;\n}\n\n/**\n * Convert an RGBW hex string to HAL (Hue, Saturation, Brightness)\n *\n * @param rgbw The color in RGB hex format (e.g. #ff0000 for red)\n * @returns The color in HAL format or null on invalid input\n */\nexport function rgbw2hal(rgbw: string): { hue: number; saturation: number; brightness: number } {\n if (!rgbw || typeof rgbw !== 'string' || !rgbw.startsWith('#') || (rgbw.length !== 9 && rgbw.length !== 5)) {\n return {\n hue: 0,\n saturation: 0,\n brightness: 0,\n };\n }\n\n let r: number;\n let g: number;\n let b: number;\n let w: number;\n\n if (rgbw.length === 9) {\n r = parseInt(rgbw.substring(1, 3), 16);\n g = parseInt(rgbw.substring(3, 5), 16);\n b = parseInt(rgbw.substring(5, 7), 16);\n w = parseInt(rgbw.substring(7, 9), 16);\n } else {\n r = parseInt(rgbw[1] + rgbw[1], 16);\n g = parseInt(rgbw[2] + rgbw[2], 16);\n b = parseInt(rgbw[3] + rgbw[3], 16);\n w = parseInt(rgbw[4] + rgbw[4], 16);\n }\n\n // remove white from RGB\n // r = Math.max(0, r - w);\n // g = Math.max(0, g - w);\n // b = Math.max(0, b - w);\n\n r /= 255;\n g /= 255;\n b /= 255;\n w /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h: number;\n const v = Math.max(max, w); // use white channel as brightness if higher\n const d = max - min;\n const s = v === 0 ? 0 : d / v;\n\n if (max === min) {\n h = 0; // achromatic\n } else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n h = 0;\n }\n h /= 6;\n }\n\n return {\n hue: Math.round(h * 360),\n saturation: parseFloat(s.toFixed(2)),\n brightness: parseFloat(v.toFixed(2)),\n };\n}\n"]}
@@ -262,7 +262,7 @@ class AlexaCustom {
262
262
  return { error: 'Invalid request: no intent!' };
263
263
  }
264
264
  const isV2Skill = !!request.customSkillV2;
265
- const getResponse = isV2Skill ? this.#getResponseV2 : this.#getResponseV1;
265
+ const getResponse = isV2Skill ? this.#getResponseV2.bind(this) : this.#getResponseV1.bind(this);
266
266
  const requestId = request.request?.requestId || '';
267
267
  if (!isEnabled) {
268
268
  if (this.lang === 'en') {