iobroker.iot 5.0.13 → 6.0.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.
- package/README.md +9 -14
- package/admin/assets/{index-DCr4hGKK.js → index-BdqghSg7.js} +40 -40
- package/admin/index_m.html +1 -1
- package/admin/rules/@mf-types/compiled-types/ActionVisu.d.ts +1 -1
- package/admin/rules/@mf-types.zip +0 -0
- package/admin/rules/assets/{ActionVisu-BN0Kjfo9.js → ActionVisu-BCZFwf_Y.js} +1 -1
- package/admin/rules/assets/{ActionVisu__loadShare__react__loadShare__.js-aa1tDx2C.js → ActionVisu__loadShare__react__loadShare__.js-B4USkKO5.js} +1 -1
- package/admin/rules/assets/{ActionVisu__loadShare__react__loadShare__.js_commonjs-proxy-DX6cx281.js → ActionVisu__loadShare__react__loadShare__.js_commonjs-proxy-CEUqE4IA.js} +1 -1
- package/admin/rules/assets/{ActionVisu__loadShare__react_mf_2_dom__loadShare__.js_commonjs-proxy-27bLZRGy.js → ActionVisu__loadShare__react_mf_2_dom__loadShare__.js_commonjs-proxy-MphP5XTI.js} +1 -1
- package/admin/rules/assets/{bootstrap-QjsDSZNA.js → bootstrap-BKoQjf4I.js} +1 -1
- package/admin/rules/assets/{index-DiSsXjpZ.js → index-BlSAfGU-.js} +4 -4
- package/admin/rules/assets/index-Dk5YUp3j.js +1187 -0
- package/admin/rules/assets/{index-C1ZEp-2N.js → index-pMP6L5OL.js} +2 -2
- package/admin/rules/assets/{jsx-runtime-CnsYFZsa.js → jsx-runtime-D-zp5RaI.js} +1 -1
- package/admin/rules/assets/{localSharedImportMap-8wECk2hR.js → localSharedImportMap-BsAeuDnA.js} +1 -1
- package/admin/rules/assets/{virtualExposes-b6CxLzZb.js → virtualExposes-B2aPQUg7.js} +1 -1
- package/admin/rules/customRuleBlocks.js +5 -5
- package/build/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js +11 -1
- package/build/lib/AlexaSmartHomeV3/Alexa/Directives/Discovery.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js +8 -1
- package/build/lib/AlexaSmartHomeV3/Alexa/Properties/TargetSetpoint.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js +8 -1
- package/build/lib/AlexaSmartHomeV3/Alexa/Properties/Temperature.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/AirCondition.js +2 -2
- package/build/lib/AlexaSmartHomeV3/Controls/AirCondition.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Control.js +7 -0
- package/build/lib/AlexaSmartHomeV3/Controls/Control.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Ct.js +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Ct.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Rgb.js +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Rgb.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/RgbSingle.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/RgbwSingle.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Thermostat.js +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Thermostat.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Controls/Volume.js +2 -2
- package/build/lib/AlexaSmartHomeV3/Controls/Volume.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/DeviceManager.js +18 -9
- package/build/lib/AlexaSmartHomeV3/DeviceManager.js.map +1 -1
- package/build/lib/AlexaSmartHomeV3/Helpers/DiscoveryValidator.js +283 -0
- package/build/lib/AlexaSmartHomeV3/Helpers/DiscoveryValidator.js.map +1 -0
- package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js +4 -0
- package/build/lib/AlexaSmartHomeV3/Helpers/Utils.js.map +1 -1
- package/build/lib/alisa.js +15 -14
- package/build/lib/googleHome.js +151 -207
- package/build/lib/remote.js +1 -1
- package/build/lib/remote.js.map +1 -1
- package/io-package.json +27 -27
- package/package.json +5 -5
- package/admin/rules/assets/index-FrXvyqvW.js +0 -1187
- package/admin/rules/mf-stats.json +0 -1
- /package/admin/rules/assets/{index-Ccpql4vu.js → index-BPY9gF0q.js} +0 -0
|
@@ -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, type PatternControl, Types } from '@iobroker/type-detector';\nimport {\n roleOrEnumLight,\n roleOrEnumBlind,\n roleOrEnumWindow,\n roleOrEnumDoor,\n roleOrEnumGate,\n} from '@iobroker/type-detector/build/roleEnumUtils';\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\n// Automatically convert AlexaV2 to V3\nconst SMART_TYPES: { [name: string]: Types } = {\n LIGHT: Types.light,\n SWITCH: Types.socket,\n THERMOSTAT: Types.thermostat,\n SMARTPLUG: Types.socket,\n SMARTLOCK: Types.lock,\n CAMERA: Types.camera,\n blinds: Types.blind, // error in the GUI\n levelSlider: Types.slider, // error in the GUI\n TV: Types.button,\n};\n\nfunction getSmartNameFromObj(\n obj: ioBroker.Object | ioBroker.StateCommon,\n instanceId: string,\n lang: ioBroker.Languages,\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 [lang]: result,\n };\n }\n // @ts-expect-error backwards compatibility\n if (result === true) {\n // Bug??\n return undefined;\n }\n\n return result;\n}\n\nasync function functionalitiesAndRooms(\n adapter: ioBroker.Adapter,\n lang: ioBroker.Languages,\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 lang,\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]?.type === 'channel') {\n return id;\n }\n\n if (objects[id]?.type === 'state') {\n const channelId = parentOf(id);\n if (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 step?: number;\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 configuredStep = state.common?.step;\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 const step =\n configuredStep === undefined || isNaN(configuredStep)\n ? (max - min) / 10\n : parseFloat(configuredStep as unknown as string);\n\n return { min, max, step };\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\n adapter.log.debug(`[ALEXA3] Starting control detection with ${Object.keys(devicesObject).length} objects...`);\n // fetch all defined rooms and functions (enumerations)\n const [functionalities, rooms] = await functionalitiesAndRooms(adapter, lang);\n\n adapter.log.debug(`[ALEXA3] Found ${functionalities.length} functionalities and ${rooms.length} rooms...`);\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 if (!devicesObject[id]) {\n // Enum has unknown member\n return;\n }\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n lang,\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 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 // 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 lang,\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 adapter.log.debug(`[ALEXA3] collected ${keys.length} states from categories...`);\n\n const idsWithSmartName: string[] = [];\n const idsToDelete: 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(\n devicesObject[id],\n adapter.namespace,\n lang,\n (adapter.config as IotAdapterConfig).noCommon,\n );\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 } else if (smartName === false) {\n // Remove this state completely from the list\n idsToDelete.push(id);\n }\n });\n\n // remove all ids that are disabled from the list by smartName: false\n if (idsToDelete.length) {\n for (let d = idsToDelete.length - 1; d >= 0; d--) {\n const id = idsToDelete[d];\n const pos = list.indexOf(id);\n if (pos !== -1) {\n list.splice(pos, 1);\n delete devicesObject[id];\n }\n }\n }\n\n adapter.log.debug(`[ALEXA3] collected ${keys.length} smart names...`);\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 const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\n\n // initialize iobroker type detector\n const options: DetectOptions = {\n objects: devicesObject,\n _keysOptional: keys,\n _usedIdsOptional: usedIds,\n ignoreIndicators,\n excludedTypes,\n detectOnlyChannel: true,\n detectAllPossibleDevices: true,\n id: '', // this will be set for each id in the list\n ignoreEnums: true,\n };\n\n // process states with defined smartName\n for (let s = 0; s < idsWithSmartName.length; s++) {\n const id = idsWithSmartName[s];\n\n const common = devicesObject[id].common;\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n lang,\n (adapter.config as IotAdapterConfig).noCommon,\n ) as SmartNameObject;\n\n if (!smartName) {\n continue;\n }\n\n options.id = id;\n options.detectAllPossibleDevices = !smartName.noAutoDetect;\n\n // If ID is hue, prioritize hue\n if (devicesObject[id].common.role?.includes('.hue')) {\n options.prioritizedTypes = [[Types.hue, Types.rgb]];\n } else if (options.prioritizedTypes) {\n delete options.prioritizedTypes;\n }\n const parentType = devicesObject[parentOf(id)]?.type;\n\n options.detectOnlyChannel = !smartName.noAutoDetect && (parentType === 'channel' || parentType === 'device');\n\n // Try to detect with typeDetector\n let controls = detector.detect(options);\n\n if (smartName.noAutoDetect && controls?.length) {\n // get only first control\n controls = [controls[0]];\n // And take only first state\n const state = controls[0].states.find(state => state.required);\n if (state) {\n state.id = id;\n controls[0].states = [state];\n }\n }\n\n // Fix GUI error\n if ((smartName.smartType as string) === 'blinds') {\n smartName.smartType = Types.blind;\n } else if ((smartName.smartType as string) === 'levelSlider') {\n smartName.smartType = Types.slider;\n }\n // if (smartName.smartType) {\n // options.limitTypesToOneOf = [smartName.smartType];\n // } else if (options.prioritizedTypes) {\n // delete options.prioritizedTypes;\n // }\n\n const possibleTypes: Types[] = controls?.map(c => c.type) || [];\n const typeWasDetected = !smartName.smartType;\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 if (controls && controls.length > 0) {\n // take the first detected control that has initial ID\n const control: PatternControl | undefined = controls.find(c => c.states.find(s => s.id === id));\n if (control) {\n smartName.smartType = control.type;\n controls = [control];\n }\n }\n\n if (!smartName.smartType) {\n // if the upper object is channel or device, try to detect there\n const channelId = getChannelId(id, devicesObject);\n const deviceId = getDeviceId(id, devicesObject);\n const enums: string[] = [];\n for (let f = 0; f < functionalities.length; f++) {\n const functionEnumItem = functionalities[f];\n const members = functionEnumItem.common.members || [];\n if (\n members.includes(id) ||\n (channelId && members.includes(channelId)) ||\n (deviceId && members.includes(deviceId))\n ) {\n enums.push(functionEnumItem._id);\n }\n }\n // Is it light related?\n if (\n roleOrEnumLight(devicesObject[id], enums) ||\n (channelId && roleOrEnumLight(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumLight(devicesObject[deviceId], enums))\n ) {\n // we will write light\n if (common.type === 'boolean') {\n smartName.smartType = Types.light;\n } else if (common.type === 'number') {\n smartName.smartType = Types.dimmer;\n }\n } else if (\n common.type === 'number' &&\n (roleOrEnumBlind(devicesObject[id], enums) ||\n (channelId && roleOrEnumBlind(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumBlind(devicesObject[deviceId], enums)))\n ) {\n // we will write blind\n smartName.smartType = Types.blind;\n } else if (\n common.type === 'number' &&\n (roleOrEnumWindow(devicesObject[id], enums) ||\n (channelId && roleOrEnumWindow(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumWindow(devicesObject[deviceId], enums)))\n ) {\n // we will write window\n if (common.type === 'number' && !common.states) {\n smartName.smartType = Types.blind;\n } else if (common.states) {\n smartName.smartType = Types.windowTilt; // fallback\n } else {\n smartName.smartType = Types.window;\n }\n } else if (\n common.type === 'boolean' &&\n (roleOrEnumDoor(devicesObject[id], enums) ||\n (channelId && roleOrEnumDoor(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumDoor(devicesObject[deviceId], enums)))\n ) {\n // we will write door\n smartName.smartType = Types.door;\n } else if (\n common.type === 'boolean' &&\n (roleOrEnumGate(devicesObject[id], enums) ||\n (channelId && roleOrEnumGate(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumGate(devicesObject[deviceId], enums)))\n ) {\n // we will write gate\n smartName.smartType = Types.gate;\n } else {\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 // Try to find out if it in a category with light, lights or lamp, and so on\n if (common.read === false) {\n // write socket if writable, but not readable\n smartName.smartType = Types.button;\n } else {\n // we will write boolean\n smartName.smartType = Types.socket;\n }\n } else if (common.type === 'number') {\n smartName.smartType = Types.slider;\n } else {\n smartName.smartType = Types.socket; // fallback\n }\n }\n }\n } else if (controls?.length) {\n // Try to find suitable control\n const control = controls.find(c => c.type === smartName.smartType);\n if (control) {\n controls = [control];\n } else {\n // If the user specified a different type, prefer it\n controls = null;\n }\n }\n\n // convert alexa2 smartType to alexa 3\n if (smartName.smartType && SMART_TYPES[smartName.smartType]) {\n smartName.smartType = SMART_TYPES[smartName.smartType];\n }\n const pattern =\n smartName.smartType && Object.keys(patterns).find(p => patterns[p].type === smartName.smartType);\n\n // try to simulate typeDetector format\n if (smartName.smartType && pattern) {\n const control: IotExternalPatternControl = controls?.[0] || JSON.parse(JSON.stringify(patterns[pattern]));\n\n // find first required\n const state = control.states.find(state => state.required);\n if (state) {\n if (!controls?.[0]) {\n state.id = id;\n }\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 lang,\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 unit: devicesObject[s.id]?.common?.unit,\n step: devicesObject[s.id]?.common?.step,\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 typeWasDetected,\n possibleTypes,\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()) || []).filter(n => n);\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 options.ignoreEnums = false;\n options.detectAllPossibleDevices = false;\n\n adapter.log.debug(`[ALEXA3] collected ${detectedControls.length} controls`);\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 parentType = devicesObject[parentOf(id)]?.type;\n options.detectOnlyChannel = parentType === 'channel' || parentType === 'device';\n\n const controls = detector.detect(options);\n const possibleTypes = controls?.map(c => c.type) || [];\n\n controls?.forEach(control => {\n const iotControl: IotExternalPatternControl = control as unknown 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 let smartDisabled = false;\n // take all smartNames if any\n iotControl.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n lang,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n if (s.smartName === false) {\n smartDisabled = true;\n adapter.log.debug(`[ALEXA3] Ignored control ${id} with type ${iotControl.type} as disabled`);\n return;\n }\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 unit: devicesObject[s.id]?.common?.unit,\n step: devicesObject[s.id]?.common?.step,\n };\n });\n if (smartDisabled) {\n // This control is disabled\n return;\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 lang,\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 possibleTypes,\n typeWasDetected: true,\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 adapter.log.debug(`[ALEXA3] sorted ${detectedControls.length} controls`);\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 * @param noRound do not round the result\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, noRound?: boolean): number | undefined {\n if (noRound) {\n return min >= max || value < min || value > max ? undefined : ((value - min) / (max - min)) * 100;\n }\n return min >= max || value < min || value > max ? undefined : Math.round(((value - min) / (max - min)) * 100);\n}\n\n/**\n * Normalizes any provided value with observed min and max to the range 0..1\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_1(value: number, min: number, max: number): number | undefined {\n return min >= max || value < min || value > max ? undefined : (value - min) / (max - min);\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 * @param noRound do not round the result\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_100(normalized: number, min: number, max: number, noRound?: boolean): number | undefined {\n if (noRound) {\n return min >= max || normalized < 0 || normalized > 100 ? undefined : (normalized / 100) * (max - min) + min;\n }\n\n return min >= max || normalized < 0 || normalized > 100\n ? undefined\n : Math.round((normalized / 100) * (max - min) + min);\n}\n\n/**\n * Denormalizes any provided value from range 0..1 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 * @param noRound do not round the result\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_1(normalized: number, min: number, max: number, noRound?: boolean): number | undefined {\n if (noRound) {\n return min >= max || normalized < 0 || normalized > 1 ? undefined : normalized * (max - min) + min;\n }\n\n return min >= max || normalized < 0 || normalized > 1 ? undefined : Math.round(normalized * (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"]}
|
|
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, type PatternControl, Types } from '@iobroker/type-detector';\nimport {\n roleOrEnumLight,\n roleOrEnumBlind,\n roleOrEnumWindow,\n roleOrEnumDoor,\n roleOrEnumGate,\n} from '@iobroker/type-detector/build/roleEnumUtils';\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\n// Automatically convert AlexaV2 to V3\nconst SMART_TYPES: { [name: string]: Types } = {\n LIGHT: Types.light,\n SWITCH: Types.socket,\n THERMOSTAT: Types.thermostat,\n SMARTPLUG: Types.socket,\n SMARTLOCK: Types.lock,\n CAMERA: Types.camera,\n blinds: Types.blind, // error in the GUI\n levelSlider: Types.slider, // error in the GUI\n TV: Types.button,\n};\n\nfunction getSmartNameFromObj(\n obj: ioBroker.Object | ioBroker.StateCommon,\n instanceId: string,\n lang: ioBroker.Languages,\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 [lang]: result,\n };\n }\n // @ts-expect-error backwards compatibility\n if (result === true) {\n // Bug??\n return undefined;\n }\n\n return result;\n}\n\nasync function functionalitiesAndRooms(\n adapter: ioBroker.Adapter,\n lang: ioBroker.Languages,\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 lang,\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]?.type === 'channel') {\n return id;\n }\n\n if (objects[id]?.type === 'state') {\n const channelId = parentOf(id);\n if (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 step?: number;\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 configuredStep = state.common?.step;\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 const step =\n configuredStep === undefined || isNaN(configuredStep)\n ? (max - min) / 10\n : parseFloat(configuredStep as unknown as string);\n\n return { min, max, step };\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\n adapter.log.debug(`[ALEXA3] Starting control detection with ${Object.keys(devicesObject).length} objects...`);\n // fetch all defined rooms and functions (enumerations)\n const [functionalities, rooms] = await functionalitiesAndRooms(adapter, lang);\n\n adapter.log.debug(`[ALEXA3] Found ${functionalities.length} functionalities and ${rooms.length} rooms...`);\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 if (!devicesObject[id]) {\n // Enum has unknown member\n return;\n }\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n lang,\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 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 // 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 lang,\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 adapter.log.debug(`[ALEXA3] collected ${keys.length} states from categories...`);\n\n const idsWithSmartName: string[] = [];\n const idsToDelete: 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(\n devicesObject[id],\n adapter.namespace,\n lang,\n (adapter.config as IotAdapterConfig).noCommon,\n );\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 } else if (smartName === false) {\n // Remove this state completely from the list\n idsToDelete.push(id);\n }\n });\n\n // remove all ids that are disabled from the list by smartName: false\n if (idsToDelete.length) {\n for (let d = idsToDelete.length - 1; d >= 0; d--) {\n const id = idsToDelete[d];\n const pos = list.indexOf(id);\n if (pos !== -1) {\n list.splice(pos, 1);\n delete devicesObject[id];\n }\n }\n }\n\n adapter.log.debug(`[ALEXA3] collected ${keys.length} smart names...`);\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 const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\n\n // initialize iobroker type detector\n const options: DetectOptions = {\n objects: devicesObject,\n _keysOptional: keys,\n _usedIdsOptional: usedIds,\n ignoreIndicators,\n excludedTypes,\n detectOnlyChannel: true,\n detectAllPossibleDevices: true,\n id: '', // this will be set for each id in the list\n ignoreEnums: true,\n };\n\n // process states with defined smartName\n for (let s = 0; s < idsWithSmartName.length; s++) {\n const id = idsWithSmartName[s];\n\n const common = devicesObject[id].common;\n const smartName = getSmartNameFromObj(\n devicesObject[id],\n adapter.namespace,\n lang,\n (adapter.config as IotAdapterConfig).noCommon,\n ) as SmartNameObject;\n\n if (!smartName) {\n continue;\n }\n\n options.id = id;\n options.detectAllPossibleDevices = !smartName.noAutoDetect;\n\n // If ID is hue, prioritize hue\n if (devicesObject[id].common.role?.includes('.hue')) {\n options.prioritizedTypes = [[Types.hue, Types.rgb]];\n } else if (options.prioritizedTypes) {\n delete options.prioritizedTypes;\n }\n const parentType = devicesObject[parentOf(id)]?.type;\n\n options.detectOnlyChannel = !smartName.noAutoDetect && (parentType === 'channel' || parentType === 'device');\n\n // Try to detect with typeDetector\n let controls = detector.detect(options);\n\n if (smartName.noAutoDetect && controls?.length) {\n // get only first control\n controls = [controls[0]];\n // And take only first state\n const state = controls[0].states.find(state => state.required);\n if (state) {\n state.id = id;\n controls[0].states = [state];\n }\n }\n\n // Fix GUI error\n if ((smartName.smartType as string) === 'blinds') {\n smartName.smartType = Types.blind;\n } else if ((smartName.smartType as string) === 'levelSlider') {\n smartName.smartType = Types.slider;\n }\n // if (smartName.smartType) {\n // options.limitTypesToOneOf = [smartName.smartType];\n // } else if (options.prioritizedTypes) {\n // delete options.prioritizedTypes;\n // }\n\n const possibleTypes: Types[] = controls?.map(c => c.type) || [];\n const typeWasDetected = !smartName.smartType;\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 if (controls && controls.length > 0) {\n // take the first detected control that has initial ID\n const control: PatternControl | undefined = controls.find(c => c.states.find(s => s.id === id));\n if (control) {\n smartName.smartType = control.type;\n controls = [control];\n }\n }\n\n if (!smartName.smartType) {\n // if the upper object is channel or device, try to detect there\n const channelId = getChannelId(id, devicesObject);\n const deviceId = getDeviceId(id, devicesObject);\n const enums: string[] = [];\n for (let f = 0; f < functionalities.length; f++) {\n const functionEnumItem = functionalities[f];\n const members = functionEnumItem.common.members || [];\n if (\n members.includes(id) ||\n (channelId && members.includes(channelId)) ||\n (deviceId && members.includes(deviceId))\n ) {\n enums.push(functionEnumItem._id);\n }\n }\n // Is it light related?\n if (\n roleOrEnumLight(devicesObject[id], enums) ||\n (channelId && roleOrEnumLight(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumLight(devicesObject[deviceId], enums))\n ) {\n // we will write light\n if (common.type === 'boolean') {\n smartName.smartType = Types.light;\n } else if (common.type === 'number') {\n smartName.smartType = Types.dimmer;\n }\n } else if (\n common.type === 'number' &&\n (roleOrEnumBlind(devicesObject[id], enums) ||\n (channelId && roleOrEnumBlind(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumBlind(devicesObject[deviceId], enums)))\n ) {\n // we will write blind\n smartName.smartType = Types.blind;\n } else if (\n common.type === 'number' &&\n (roleOrEnumWindow(devicesObject[id], enums) ||\n (channelId && roleOrEnumWindow(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumWindow(devicesObject[deviceId], enums)))\n ) {\n // we will write window\n if (common.type === 'number' && !common.states) {\n smartName.smartType = Types.blind;\n } else if (common.states) {\n smartName.smartType = Types.windowTilt; // fallback\n } else {\n smartName.smartType = Types.window;\n }\n } else if (\n common.type === 'boolean' &&\n (roleOrEnumDoor(devicesObject[id], enums) ||\n (channelId && roleOrEnumDoor(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumDoor(devicesObject[deviceId], enums)))\n ) {\n // we will write door\n smartName.smartType = Types.door;\n } else if (\n common.type === 'boolean' &&\n (roleOrEnumGate(devicesObject[id], enums) ||\n (channelId && roleOrEnumGate(devicesObject[channelId], enums)) ||\n (deviceId && roleOrEnumGate(devicesObject[deviceId], enums)))\n ) {\n // we will write gate\n smartName.smartType = Types.gate;\n } else {\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 // Try to find out if it in a category with light, lights or lamp, and so on\n if (common.read === false) {\n // write socket if writable, but not readable\n smartName.smartType = Types.button;\n } else {\n // we will write boolean\n smartName.smartType = Types.socket;\n }\n } else if (common.type === 'number') {\n smartName.smartType = Types.slider;\n } else {\n smartName.smartType = Types.socket; // fallback\n }\n }\n }\n } else if (controls?.length) {\n // Try to find suitable control\n const control = controls.find(c => c.type === smartName.smartType);\n if (control) {\n controls = [control];\n } else {\n // If the user specified a different type, prefer it\n controls = null;\n }\n }\n\n // convert alexa2 smartType to alexa 3\n if (smartName.smartType && SMART_TYPES[smartName.smartType]) {\n smartName.smartType = SMART_TYPES[smartName.smartType];\n }\n const pattern =\n smartName.smartType && Object.keys(patterns).find(p => patterns[p].type === smartName.smartType);\n\n // try to simulate typeDetector format\n if (smartName.smartType && pattern) {\n const control: IotExternalPatternControl = controls?.[0] || JSON.parse(JSON.stringify(patterns[pattern]));\n\n // find first required\n const state = control.states.find(state => state.required);\n if (state) {\n if (!controls?.[0]) {\n state.id = id;\n }\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 lang,\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 unit: devicesObject[s.id]?.common?.unit,\n step: devicesObject[s.id]?.common?.step,\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 typeWasDetected,\n possibleTypes,\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()) || []).filter(n => n);\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 options.ignoreEnums = false;\n options.detectAllPossibleDevices = false;\n\n adapter.log.debug(`[ALEXA3] collected ${detectedControls.length} controls`);\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 parentType = devicesObject[parentOf(id)]?.type;\n options.detectOnlyChannel = parentType === 'channel' || parentType === 'device';\n\n const controls = detector.detect(options);\n const possibleTypes = controls?.map(c => c.type) || [];\n\n controls?.forEach(control => {\n const iotControl: IotExternalPatternControl = control as unknown 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 let smartDisabled = false;\n // take all smartNames if any\n iotControl.states.forEach(s => {\n s.smartName = getSmartNameFromObj(\n devicesObject[s.id],\n adapter.namespace,\n lang,\n (adapter.config as IotAdapterConfig).noCommon,\n );\n if (s.smartName === false) {\n smartDisabled = true;\n adapter.log.debug(`[ALEXA3] Ignored control ${id} with type ${iotControl.type} as disabled`);\n return;\n }\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 unit: devicesObject[s.id]?.common?.unit,\n step: devicesObject[s.id]?.common?.step,\n };\n });\n if (smartDisabled) {\n // This control is disabled\n return;\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 lang,\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 possibleTypes,\n typeWasDetected: true,\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 adapter.log.debug(`[ALEXA3] sorted ${detectedControls.length} controls`);\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 * @param noRound do not round the result\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, noRound?: boolean): number | undefined {\n if (noRound) {\n return min >= max || value < min || value > max ? undefined : ((value - min) / (max - min)) * 100;\n }\n return min >= max || value < min || value > max ? undefined : Math.round(((value - min) / (max - min)) * 100);\n}\n\n/**\n * Normalizes any provided value with observed min and max to the range 0..1\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_1(value: number, min: number, max: number): number | undefined {\n return min >= max || value < min || value > max ? undefined : (value - min) / (max - min);\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 * @param noRound do not round the result\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_100(normalized: number, min: number, max: number, noRound?: boolean): number | undefined {\n if (noRound) {\n return min >= max || normalized < 0 || normalized > 100 ? undefined : (normalized / 100) * (max - min) + min;\n }\n\n return min >= max || normalized < 0 || normalized > 100\n ? undefined\n : Math.round((normalized / 100) * (max - min) + min);\n}\n\n/**\n * Denormalizes any provided value from range 0..1 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 * @param noRound do not round the result\n * @returns Denormalized value in the range min-max\n */\nexport function denormalize_0_1(normalized: number, min: number, max: number, noRound?: boolean): number | undefined {\n if (noRound) {\n return min >= max || normalized < 0 || normalized > 1 ? undefined : normalized * (max - min) + min;\n }\n\n return min >= max || normalized < 0 || normalized > 1 ? undefined : Math.round(normalized * (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 // Extract the common white component (min of R,G,B = p) into the dedicated white channel\n // const w = p;\n // return `#${toHex(to255(r - w))}${toHex(to255(g - w))}${toHex(to255(b - w))}${toHex(to255(w))}`;\n // Simple calculations\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"]}
|
package/build/lib/alisa.js
CHANGED
|
@@ -126,7 +126,6 @@ class YandexAliceConverter {
|
|
|
126
126
|
return new Promise(resolve => {
|
|
127
127
|
const attribute = entity.ATTRIBUTES.find(attr => attr.attribute === name);
|
|
128
128
|
const stateId = attribute ? attribute.getId || attribute.setId : undefined;
|
|
129
|
-
entity.context.capabilities = [];
|
|
130
129
|
const capability = entity.context.properties.find(
|
|
131
130
|
cap => cap.type === 'devices.properties.event' && cap.parameters.instance === name,
|
|
132
131
|
);
|
|
@@ -470,8 +469,8 @@ class YandexAliceConverter {
|
|
|
470
469
|
const attribute = entity.ATTRIBUTES.find(attr => attr.attribute === 'rgb');
|
|
471
470
|
const stateId = attribute ? attribute.getId : undefined;
|
|
472
471
|
const capability = data.capabilities.find(cap => cap.type === 'devices.capabilities.color_setting');
|
|
473
|
-
if (capability
|
|
474
|
-
const val = capability.state.value.toString(16);
|
|
472
|
+
if (capability?.state && stateId && capability.state.instance === 'rgb') {
|
|
473
|
+
const val = capability.state.value.toString(16).padStart(6, '0');
|
|
475
474
|
this.adapter.setForeignState(stateId, `#${val}`);
|
|
476
475
|
capability.state.action_result = { status: 'DONE' };
|
|
477
476
|
}
|
|
@@ -752,13 +751,13 @@ class YandexAliceConverter {
|
|
|
752
751
|
|
|
753
752
|
state = control.states.find(s => s.id && ['DIMMER', 'SET', 'BRIGHTNESS'].includes(s.name));
|
|
754
753
|
let setDimmer = '';
|
|
755
|
-
if (state
|
|
754
|
+
if (state?.id) {
|
|
756
755
|
setDimmer = state.id;
|
|
757
756
|
entity.ATTRIBUTES.push({
|
|
758
757
|
attribute: 'brightness',
|
|
759
758
|
getId: getDimmer || setDimmer,
|
|
760
759
|
setId: setDimmer,
|
|
761
|
-
type: objects[setDimmer]
|
|
760
|
+
type: objects[setDimmer]?.common?.type,
|
|
762
761
|
});
|
|
763
762
|
this._addID2entity(state.id, entity);
|
|
764
763
|
} else if (getDimmer) {
|
|
@@ -766,9 +765,9 @@ class YandexAliceConverter {
|
|
|
766
765
|
attribute: 'brightness',
|
|
767
766
|
getId: getDimmer,
|
|
768
767
|
setId: null,
|
|
769
|
-
type: objects[getDimmer]
|
|
768
|
+
type: objects[getDimmer]?.common?.type,
|
|
770
769
|
});
|
|
771
|
-
this._addID2entity(
|
|
770
|
+
this._addID2entity(getDimmer, entity);
|
|
772
771
|
}
|
|
773
772
|
|
|
774
773
|
// capabilities
|
|
@@ -1118,7 +1117,7 @@ class YandexAliceConverter {
|
|
|
1118
1117
|
}
|
|
1119
1118
|
|
|
1120
1119
|
state = control.states.find(s => s.id && s.name === 'ACTUAL');
|
|
1121
|
-
if (state
|
|
1120
|
+
if (state?.id && objects[state.id]?.common?.type === 'boolean') {
|
|
1122
1121
|
entity.STATE.getId = state.id;
|
|
1123
1122
|
this._addID2entity(state.id, entity);
|
|
1124
1123
|
}
|
|
@@ -1755,10 +1754,10 @@ class YandexAlisa {
|
|
|
1755
1754
|
if (func) {
|
|
1756
1755
|
pos = _name.indexOf(func.toLowerCase());
|
|
1757
1756
|
if (pos !== -1) {
|
|
1758
|
-
name = name.substring(0, pos) + name.substring(pos +
|
|
1757
|
+
name = name.substring(0, pos) + name.substring(pos + func.length + 1);
|
|
1759
1758
|
}
|
|
1760
1759
|
}
|
|
1761
|
-
name = name.replace(/\s\s/g).replace(/\s\s/g).trim();
|
|
1760
|
+
name = name.replace(/\s\s/g, ' ').replace(/\s\s/g, ' ').trim();
|
|
1762
1761
|
}
|
|
1763
1762
|
return name;
|
|
1764
1763
|
}
|
|
@@ -2058,8 +2057,7 @@ class YandexAlisa {
|
|
|
2058
2057
|
let ids = Object.keys(objects);
|
|
2059
2058
|
|
|
2060
2059
|
this.enums = [];
|
|
2061
|
-
this.smartDevices =
|
|
2062
|
-
this.enums = [];
|
|
2060
|
+
this.smartDevices = [];
|
|
2063
2061
|
this.usedIds = [];
|
|
2064
2062
|
this.keys = [];
|
|
2065
2063
|
|
|
@@ -2310,8 +2308,11 @@ class YandexAlisa {
|
|
|
2310
2308
|
doAction(deviceData) {
|
|
2311
2309
|
return new Promise(resolve => {
|
|
2312
2310
|
const entity = this.smartDevices.find(entity => deviceData.id === entity.context.id);
|
|
2313
|
-
|
|
2314
|
-
|
|
2311
|
+
if (entity) {
|
|
2312
|
+
resolve(this._doSmartDeviceAction(entity, deviceData));
|
|
2313
|
+
} else {
|
|
2314
|
+
resolve();
|
|
2315
|
+
}
|
|
2315
2316
|
});
|
|
2316
2317
|
}
|
|
2317
2318
|
|