iobroker.iot 4.2.5 → 4.2.7

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.
@@ -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/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\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};\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 // @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): 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]?.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} {\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 if (!devicesObject[id]) {\n // Enum has unknown member\n return;\n }\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 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 (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 const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\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 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 if (!smartName) {\n continue;\n }\n options.id = id;\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 = parentType === 'channel' || parentType === 'device';\n\n // Try to detect with typeDetector\n let controls = detector.detect(options);\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 (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 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()) || [];\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\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 const possibleTypes = controls?.map(c => c.type) || [];\n\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 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 (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 };\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 (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 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 * 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 * 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/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\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};\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 // @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): 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]?.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} {\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 if (!devicesObject[id]) {\n // Enum has unknown member\n return;\n }\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 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 (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 const usedIds: string[] = [];\n const ignoreIndicators = ['UNREACH_STICKY']; // Ignore indicators by name\n const excludedTypes = [Types.info];\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 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 if (!smartName) {\n continue;\n }\n options.id = id;\n if (smartName.noAutoDetect) {\n options.detectAllPossibleDevices = false;\n } else {\n options.detectAllPossibleDevices = true;\n }\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 (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 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()) || [];\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 // 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 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 (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 };\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 (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 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 * 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 * 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"]}
package/build/main.js CHANGED
@@ -866,7 +866,7 @@ class IotAdapter extends adapter_core_1.Adapter {
866
866
  else {
867
867
  let isCustom = false;
868
868
  let _type = type;
869
- if (_type.match(/^custom_/)) {
869
+ if (_type.startsWith('custom_')) {
870
870
  _type = _type.substring(7);
871
871
  isCustom = true;
872
872
  }
@@ -1202,6 +1202,40 @@ class IotAdapter extends adapter_core_1.Adapter {
1202
1202
  }
1203
1203
  }
1204
1204
  }
1205
+ async syncServiceStates() {
1206
+ const states = await this.getObjectViewAsync('system', 'state', {
1207
+ startkey: `${this.namespace}.services.`,
1208
+ endkey: `${this.namespace}.services.\u9999`,
1209
+ });
1210
+ // Create new states
1211
+ for (let s = 0; s < this.config.allowedServices.length; s++) {
1212
+ const type = this.config.allowedServices[s];
1213
+ if (!states.rows.find(st => st.id === `${this.namespace}.services.custom_${type}`)) {
1214
+ await this.setObjectNotExistsAsync(`services.custom_${type}`, {
1215
+ _id: `${this.namespace}.services.custom_${type}`,
1216
+ type: 'state',
1217
+ common: {
1218
+ name: `Service for ${type}`,
1219
+ write: false,
1220
+ read: true,
1221
+ type: 'mixed',
1222
+ role: 'value',
1223
+ },
1224
+ native: {},
1225
+ });
1226
+ }
1227
+ }
1228
+ // delete all service states
1229
+ for (let s = 0; s < (states?.rows?.length || 0); s++) {
1230
+ const id = states.rows[s].id;
1231
+ if (id.startsWith(`${this.namespace}.services.custom_`)) {
1232
+ const stateId = id.substring(`${this.namespace}.services.custom_`.length);
1233
+ if (!this.config.allowedServices.includes(stateId)) {
1234
+ await this.delStateAsync(id);
1235
+ }
1236
+ }
1237
+ }
1238
+ }
1205
1239
  async main() {
1206
1240
  if (this.config.googleHome === undefined) {
1207
1241
  this.config.googleHome = false;
@@ -1268,6 +1302,7 @@ class IotAdapter extends adapter_core_1.Adapter {
1268
1302
  .split(/[,\s]+/)
1269
1303
  .map(s => s.trim())
1270
1304
  .filter(s => s);
1305
+ await this.syncServiceStates();
1271
1306
  await this.setStateAsync('info.connection', false, true);
1272
1307
  this.config.cloudUrl = this.config.cloudUrl || 'a18wym7vjdl22g.iot.eu-west-1.amazonaws.com';
1273
1308
  if (!this.config.login || !this.config.pass) {