iobroker.sonoff 4.2.0 → 5.0.0

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":"mqttBase.js","sourceRoot":"","sources":["../../src/lib/mqttBase.ts"],"names":[],"mappings":"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","sourcesContent":["import types from './datapoints';\nimport type { SonoffAdapterConfig } from '../types';\n\nconst hueCalc = true;\nexport const FORBIDDEN_CHARS = /[\\]\\\\[*,;'\"`<>\\\\?]/g;\nconst NO_PREFIX = '';\n\n/*\n * HSV to RGB color conversion\n *\n * H runs from 0 to 360 degrees\n * S and V run from 0 to 100\n *\n * Ported from the excellent java algorithm by Eugene Vishnevsky at:\n * http://www.cs.rit.edu/~ncs/color/t_convert.html\n */\nfunction hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n let r: number;\n let g: number;\n let b: number;\n\n // Make sure our arguments stay in-range\n h = Math.max(0, Math.min(360, h));\n s = Math.max(0, Math.min(100, s));\n v = Math.max(0, Math.min(100, v));\n\n // We accept saturation and value arguments from 0 to 100 because that's\n // how Photoshop represents those values. Internally, however, the\n // saturation and value are calculated from a range of 0 to 1. We make\n // That conversion here.\n s /= 100;\n v /= 100;\n\n if (s === 0) {\n // Achromatic (grey)\n r = g = b = v;\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n }\n\n h /= 60; // sector 0 to 5\n const i = Math.floor(h);\n const f = h - i; // factorial part of h\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n\n default: // case 5:\n r = v;\n g = p;\n b = q;\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n}\n\nfunction componentToHex(c: number): string {\n const hex = c.toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n}\n\nfunction toPaddedHexString(num: number, len: number): string {\n if (len === 2) {\n if (num > 255) {\n num = 255;\n }\n }\n const str = num.toString(16);\n if (str.length >= len) {\n return str;\n }\n return '0'.repeat(len - str.length) + str;\n}\n\nexport interface MQTTPacket {\n topic: string;\n payload: Buffer | string;\n qos?: 0 | 1 | 2;\n retain?: boolean;\n messageId: number;\n}\n\nexport interface MQTTPacketStored extends MQTTPacket {\n ts: number;\n cmd: 'pubrel' | 'publish';\n count: number;\n}\n\nexport interface MQTTClient {\n __secret: string;\n id: string;\n iobId: string;\n cleanSession: boolean;\n _will?: MQTTPacket;\n _messages: MQTTPacketStored[];\n _subsID: { [key: string]: number };\n _subs: { [key: string]: string[] };\n _resendonStart: ReturnType<typeof setTimeout> | null;\n _map: { [key: string]: string };\n _fallBackName: string;\n /** True as soon as the information of the device (Status 5 and Status 2) was requested */\n _infoRequested?: boolean;\n\n on: (event: string, callback: (args: any) => void) => void;\n connack: (options: { returnCode: number; sessionPresent?: boolean }) => void;\n puback: (options: { messageId: number }) => void;\n pubrec: (options: { messageId: number }) => void;\n pubrel: (options: { messageId: number }) => void;\n pubcomp: (options: { messageId: number }) => void;\n unsuback: (options: { messageId: number }) => void;\n suback: (options: { granted: number[]; messageId: number }) => void;\n pingresp: () => void;\n destroy: () => void;\n publish: (packet: MQTTPacket | MQTTPacket[], cb?: () => void) => void;\n stream: {\n remoteAddress: string;\n remotePort: number;\n };\n}\n\nexport interface Task {\n id: string;\n data: ioBroker.StateObject | ioBroker.ChannelObject;\n storeMap?: boolean;\n setState?: true;\n setValue?: ioBroker.StateValue;\n}\n\nexport default abstract class MQTTBase {\n protected readonly clients: { [key: string]: MQTTClient } = {};\n protected readonly tasks: Task[] = [];\n protected taskCallbacks: (() => void)[] = [];\n protected mappingClients: { [iobId: string]: string } = {};\n protected readonly adapter: ioBroker.Adapter;\n\n protected readonly cacheAddedObjects: { [id: string]: boolean } = {};\n protected readonly cachedModeExor: { [id: string]: boolean } = {};\n protected readonly cachedReadColors: { [id: string]: boolean } = {};\n protected readonly cachePowerObjects: { [id: string]: true } = {};\n protected readonly specVars = [\n 'Red',\n 'Green',\n 'Blue',\n 'WW',\n 'CW',\n 'Color',\n 'RGB_POWER',\n 'WW_POWER',\n 'CW_POWER',\n 'Hue',\n 'Saturation',\n ];\n protected readonly config: SonoffAdapterConfig;\n\n constructor(adapter: ioBroker.Adapter) {\n this.adapter = adapter;\n this.config = adapter.config as SonoffAdapterConfig;\n this.config.defaultQoS = (parseInt(this.config.defaultQoS as unknown as string, 10) as 0 | 1 | 2) || 0;\n }\n\n protected abstract sendState2Client(\n client: MQTTClient,\n topic: string,\n state: ioBroker.StateValue,\n qos: 0 | 1 | 2,\n ): void;\n\n abstract destroy(): Promise<void>;\n\n private setColor(channelId: string, val: ioBroker.StateValue): void {\n const stateId = 'Color';\n if (this.clients[channelId]?._map?.[stateId]) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n this.clients[channelId]._map[stateId] || 'cmnd/sonoff/Color',\n val,\n this.config.defaultQoS,\n ),\n );\n } else if (this.clients[channelId]?._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/${stateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Unknown mapping for \"${stateId}\"`);\n }\n }\n\n private setPower(channelId: string, val: ioBroker.StateValue): void {\n const stateId = 'POWER';\n if (val === '' || val === null || val === undefined) {\n return this.adapter.log.debug('Empty power was ignored');\n }\n if (this.clients[channelId]._map?.[stateId]) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n this.clients[channelId]._map[stateId] || 'cmnd/sonoff/POWER',\n val ? 'ON' : 'OFF',\n this.config.defaultQoS,\n ),\n );\n } else if (this.clients[channelId]._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/${stateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Unknown mapping for \"${stateId}\"`);\n }\n }\n\n private setZbSendCommand(\n channelId: string,\n deviceId: string,\n attribute: string,\n val: ioBroker.StateValue | undefined,\n ): void {\n // Send Zigbee command via ZbSend\n const zbSendCommand = JSON.stringify({\n device: deviceId,\n send: {\n [attribute]: val,\n },\n });\n\n if (this.clients[channelId]?._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/ZbSend`,\n zbSendCommand,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Cannot send ZbSend command for device ${deviceId}: client not found`);\n }\n }\n\n /**\n * Transform shutter state names to correct Tasmota command format\n * e.g., \"Shutter1_Position\" -> \"ShutterPosition1\"\n * e.g., \"Shutter1_Tilt\" -> \"ShutterTilt1\"\n *\n * @param stateId - The original state ID to transform\n * @returns The transformed state ID for Tasmota commands\n */\n private transformShutterStateId(stateId: string): string {\n const shutterMatch = stateId.match(/^Shutter(\\d+)_(Position|Direction|Target|Tilt)$/);\n if (shutterMatch) {\n const shutterNumber = shutterMatch[1];\n const command = shutterMatch[2];\n return `Shutter${command}${shutterNumber}`;\n }\n return stateId;\n }\n\n private setStateImmediate(channelId: string, stateId: string, val: ioBroker.StateValue): void {\n // Transform shutter state names to correct Tasmota command format\n const transformedStateId = this.transformShutterStateId(stateId);\n\n if (this.clients[channelId]?._map?.[stateId]) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n this.clients[channelId]._map[stateId] || `cmnd/sonoff/${transformedStateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else if (this.clients[channelId]?._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/${transformedStateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Unknown mapping for \"${stateId}\"`);\n }\n }\n\n private async _setState(id: string, val: ioBroker.StateValue): Promise<void> {\n this.adapter.log.debug(`Set state after task: ${id}`);\n await this.adapter.setForeignStateAsync(id, val, true);\n }\n\n protected updateState(task: Task, val?: ioBroker.StateValue | (() => void), callback?: () => void): void {\n if (typeof val === 'function') {\n callback = val;\n val = undefined;\n }\n if (val !== undefined) {\n task.setState = true;\n task.setValue = val;\n }\n this.tasks.push(task);\n\n if (callback) {\n this.taskCallbacks.push(callback);\n }\n this.adapter.log.debug(`Update state ${task.id} - ${this.tasks.length}`);\n if (this.tasks.length === 1) {\n this.processTasks().catch(err => this.adapter.log.error(err));\n }\n }\n\n private async onStateChangedColors(\n id: string,\n state: ioBroker.State,\n channelId?: string,\n stateId?: string,\n ): Promise<void> {\n if (!channelId) {\n const parts = id.split('.');\n stateId = parts.pop() || '';\n\n if (\n stateId === 'level' ||\n stateId === 'state' ||\n stateId === 'red' ||\n stateId === 'blue' ||\n stateId === 'green'\n ) {\n stateId = `${parts.pop()}.${stateId}`;\n }\n\n channelId = parts.splice(2, parts.length).join('.');\n }\n const ledModeIdExor = `${this.adapter.namespace}.${channelId}.modeLedExor`;\n if (this.cachedModeExor[ledModeIdExor] === undefined) {\n const _state = await this.adapter.getForeignStateAsync(ledModeIdExor);\n this.cachedModeExor[ledModeIdExor] = _state ? (_state.val as boolean) || false : true;\n setImmediate(() => this.onStateChangedColors(id, state, channelId, stateId));\n return;\n }\n\n // ledstripe objects\n const exorWhiteLeds = this.cachedModeExor[ledModeIdExor]; // exor for white leds and color leds => if white leds are switched on, color leds are switched off and vice versa (default on)\n\n // now evaluate ledstripe vars\n // adaptions for magichome tasmota\n if (stateId?.match(/Color\\d?/)) {\n // id = sonoff.0.DVES_96ABFA.Color\n // statid=Color\n // state = {\"val\":\"#faadcf\",\"ack\":false,\"ts\":1520146102580,\"q\":0,\"from\":\"system.this.adapter.web.0\",\"lc\":1520146102580}\n\n // set white to rgb or rgbww\n const obj = await this.adapter.getObjectAsync(id);\n if (!obj) {\n this.adapter.log.warn(`Invalid rgbww obj for ${id}`);\n } else if (typeof state.val !== 'string') {\n this.adapter.log.warn(\n `Invalid rgbww state value for ${id} : ${JSON.stringify(state.val)} needs to be a string`,\n );\n } else {\n const role = obj.common.role;\n let color;\n\n if (role === 'level.color.rgbww') {\n // rgbww\n if (state.val.toUpperCase() === '#FFFFFF') {\n // transform white to WW\n //color='000000FF';\n color = `${state.val.substring(1)}00`;\n } else {\n // strip # char and add ww\n color = `${state.val.substring(1)}00`;\n }\n } else if (role === 'level.color.rgbcwww') {\n color = `${state.val.substring(1)}0000`;\n } else {\n // rgb, strip # char\n color = state.val.substring(1);\n }\n\n this.setColor(channelId, color);\n\n // set rgb too\n const hidE = id.split('.');\n const deviceDesc = `${hidE[0]}.${hidE[1]}.${hidE[2]}`;\n await this.adapter.setStateAsync(\n `${deviceDesc}.Red`,\n (100 * parseInt(color.substring(0, 2), 16)) / 255,\n true,\n );\n await this.adapter.setStateAsync(\n `${deviceDesc}.Green`,\n (100 * parseInt(color.substring(2, 4), 16)) / 255,\n true,\n );\n await this.adapter.setStateAsync(\n `${deviceDesc}.Blue`,\n (100 * parseInt(color.substring(4, 6), 16)) / 255,\n true,\n );\n }\n return;\n }\n\n const hidE = id.split('.');\n const deviceDesc = `${hidE[0]}.${hidE[1]}.${hidE[2]}`;\n if (stateId?.match(/Red\\d?/)) {\n // set red component\n if ((state.val as number) > 100) {\n state.val = 100;\n }\n const red = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace red component\n const out = red + color.substring(2, 10);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n } else if (stateId?.match(/Green\\d?/)) {\n // set green component\n if ((state.val as number) > 100) {\n state.val = 100;\n }\n const green = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace green component\n const out = color.substring(0, 2) + green + color.substring(4, 10);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n return;\n }\n if (stateId?.match(/Blue\\d?/)) {\n // set blue component\n if ((state.val as number) > 100) {\n state.val = 100;\n }\n const blue = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace blue component\n const out = color.substring(0, 4) + blue + color.substring(6, 10);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n return;\n }\n\n if (stateId?.match(/RGB_POWER\\d?/)) {\n // set ww component\n const rgbpow = state.val === 'true' || state.val === true || state.val === 1 || state.val === '1';\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state || typeof _state.val !== 'string') {\n this.adapter.log.info(`Invalid state color for ${idAlive}, correcting value to #000000`);\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val.substring(1);\n let rgb = '000000';\n if (rgbpow) {\n rgb = 'FFFFFF';\n }\n // replace rgb component\n let out = rgb + color.substring(6, 10);\n\n if (rgbpow && exorWhiteLeds) {\n out = `${rgb}0000`;\n let idAlive = `${deviceDesc}.WW_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n idAlive = `${deviceDesc}.WW`;\n await this.adapter.setStateAsync(idAlive, 0, false);\n idAlive = `${deviceDesc}.CW_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n idAlive = `${deviceDesc}.CW`;\n await this.adapter.setStateAsync(idAlive, 0, false);\n }\n this.setColor(channelId, out);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n if (rgbpow) {\n this.setPower(channelId, true);\n }\n // if led_mode&1, exor white leds\n return;\n }\n\n if (hueCalc && stateId?.match(/Hue\\d?/)) {\n // calc hue + saturation params to rgb\n let hue = state.val as number;\n if (hue > 359) {\n hue = 359;\n }\n // recalc color by hue\n const idAlive = `${deviceDesc}.Dimmer`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n const dim = 100;\n await this.adapter.setStateAsync(idAlive, dim, true);\n } else {\n const dim = _state.val as number;\n const idAlive = `${deviceDesc}.Saturation`;\n const __state = await this.adapter.getForeignStateAsync(idAlive);\n if (!__state) {\n const sat = 100;\n await this.adapter.setStateAsync(idAlive, sat, true);\n } else {\n const sat = __state.val as number;\n const rgb = hsvToRgb(hue, sat, dim);\n const hexVal = componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n const idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${hexVal}`, false);\n }\n }\n return;\n }\n\n if (hueCalc && stateId?.match(/Saturation\\d?/)) {\n let sat = state.val as number;\n if (sat > 100) {\n sat = 100;\n }\n // recalc color by saturation\n const idAlive = `${deviceDesc}.Dimmer`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n const dim = 100;\n await this.adapter.setStateAsync(idAlive, dim, true);\n // this.adapter.log.warn('ill state Dimmer');\n } else {\n const dim = _state.val as number;\n const idAlive = `${deviceDesc}.Hue`;\n const __state = await this.adapter.getForeignStateAsync(idAlive);\n if (!__state) {\n const hue = 100;\n await this.adapter.setStateAsync(idAlive, hue, true);\n } else {\n const hue = __state.val as number;\n const rgb = hsvToRgb(hue, sat, dim);\n const hexVal = componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n const idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${hexVal}`, false);\n }\n }\n return;\n }\n\n // get color attributes to check other ledstripe vars\n const idAlive = `${deviceDesc}.Color`;\n const obj = await this.adapter.getForeignObjectAsync(idAlive);\n if (!obj) {\n // no color object\n this.adapter.log.warn(`Unknown object: ${id}: ${JSON.stringify(state)}`);\n } else {\n const role = obj.common.role;\n //if (role='level.color.rgb') return;\n let wwindex;\n if (role === 'level.color.rgbww') {\n wwindex = 6;\n } else {\n wwindex = 8;\n }\n\n if (stateId?.match(/WW_POWER\\d?/)) {\n // set ww component\n const wwpow = state.val === 'true' || state.val === true || state.val === 1 || state.val === '1';\n let idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n this.adapter.log.warn('ill state color');\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n let ww = '00';\n if (wwpow) {\n ww = 'FF';\n }\n // replace ww component\n let out = color.substring(0, wwindex) + ww;\n if (wwpow && exorWhiteLeds) {\n out = `000000${ww}`;\n const idAlive = `${deviceDesc}.RGB_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n }\n\n idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n\n // set ww channel\n idAlive = `${deviceDesc}.WW`;\n await this.adapter.setStateAsync(idAlive, (100 * parseInt(out.substring(6, 8), 16)) / 255, true);\n\n // in case POWER is off, switch it on\n wwpow && this.setPower(channelId, true);\n return;\n }\n\n if (stateId?.match(/CW_POWER\\d?/)) {\n // set ww component\n const cwpow = state.val === 'true' || state.val === true || state.val === 1 || state.val === '1';\n let idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n this.adapter.log.warn('ill state color');\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n let cw = '00';\n if (cwpow) {\n cw = 'FF';\n }\n // replace cw component\n let out = color.substring(0, 6) + cw + color.substring(8, 10);\n if (cwpow && exorWhiteLeds) {\n out = `000000${cw}${color.substring(8, 10)}`;\n const idAlive = `${deviceDesc}.RGB_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n }\n\n idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n\n // set cw channel\n idAlive = `${deviceDesc}.CW`;\n await this.adapter.setStateAsync(idAlive, (100 * parseInt(out.substring(6, 8), 16)) / 255, true);\n\n // in case POWER is off, switch it on\n if (cwpow) {\n const idAlive = `${deviceDesc}.POWER`;\n await this.adapter.setStateAsync(idAlive, true, false);\n }\n return;\n }\n\n if (stateId?.match(/WW\\d?/)) {\n // set ww component\n const ww = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace ww component\n const out = color.substring(0, wwindex) + ww;\n this.setColor(channelId, out);\n return;\n }\n\n if (stateId?.match(/CW\\d?/)) {\n // set ww component\n const cw = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace cw component\n const out = color.substring(0, 6) + cw + color.substring(8, 10);\n this.setColor(channelId, out);\n }\n }\n }\n\n async onStateChange(id: string, state: ioBroker.State): Promise<void> {\n this.adapter.log.debug(`onStateChange ${id}: ${JSON.stringify(state)}`);\n if (state && !state.ack) {\n // find client.id\n const parts = id.split('.');\n const stateId = parts.pop() || '';\n const channelId = parts.splice(2, parts.length).join('.');\n\n // Check if this is a Zigbee device state change\n // Pattern: ZbReceived_DEVICEID_ATTRIBUTE (e.g., ZbReceived_0x0856_Power)\n const zbMatch = stateId.match(/^ZbReceived_([^_]+)_(Power|Dimmer)$/);\n if (zbMatch && this.clients[this.mappingClients[channelId]]) {\n const deviceId = zbMatch[1];\n const attribute = zbMatch[2];\n let zbValue: ioBroker.StateValue | undefined;\n\n // Convert values for Zigbee commands\n if (attribute === 'Power') {\n zbValue = state.val ? '1' : '0';\n } else if (attribute === 'Dimmer') {\n zbValue = state.val;\n }\n\n this.adapter.log.debug(`Sending ZbSend command for device ${deviceId}: ${attribute}=${zbValue}`);\n this.setZbSendCommand(this.mappingClients[channelId], deviceId, attribute, zbValue);\n return;\n }\n\n if (this.clients[this.mappingClients[channelId]]) {\n // check for special led-stripe vars\n if (!this.specVars.includes(stateId)) {\n // other objects\n const obj = await this.adapter.getObjectAsync(id);\n if (!obj) {\n this.adapter.log.warn(`Invalid object ${id}`);\n } else {\n const type = obj.common.type;\n switch (type) {\n case 'boolean':\n this.setStateImmediate(\n this.mappingClients[channelId],\n stateId,\n state.val ? 'ON' : 'OFF',\n );\n break;\n case 'number':\n this.setStateImmediate(\n this.mappingClients[channelId],\n stateId,\n state.val === null ? '' : state.val.toString(),\n );\n break;\n case 'string':\n this.setStateImmediate(\n this.mappingClients[channelId],\n stateId,\n state.val === null ? '' : state.val.toString(),\n );\n break;\n }\n }\n } else if (state.val !== null) {\n await this.onStateChangedColors(id, state, channelId, stateId);\n }\n } else {\n if (!this.config.ignoreNotConnectedWarnings) {\n this.adapter.log.info(`Client \"${channelId}\" not connected`);\n }\n }\n }\n }\n\n /**\n * Forgets everything that was cached about the objects of one device, so the next message from it\n * recreates them. `processTasks` creates every object only once per adapter run\n * (`cacheAddedObjects`), so data points that were deleted from outside - e.g. by the device\n * manager's \"delete and recreate all data points\" action - would otherwise never come back until\n * the adapter is restarted.\n *\n * @param deviceId full ID of the device channel, e.g. \"sonoff.0.DVES_123456\"\n */\n public forgetObjects(deviceId: string): void {\n const prefix = `${deviceId}.`;\n const caches: Record<string, unknown>[] = [\n this.cacheAddedObjects,\n this.cachedModeExor,\n this.cachedReadColors,\n this.cachePowerObjects,\n ];\n for (const cache of caches) {\n for (const id of Object.keys(cache)) {\n if (id === deviceId || id.startsWith(prefix)) {\n delete cache[id];\n }\n }\n }\n }\n\n protected async processTasks(callback?: () => void): Promise<void> {\n if (callback) {\n this.taskCallbacks.push(callback);\n }\n if (!this.tasks?.length) {\n const doCallbacks = this.taskCallbacks;\n this.taskCallbacks = [];\n doCallbacks.forEach(cb => typeof cb === 'function' && cb());\n return;\n }\n const task: Task = this.tasks[0];\n this.adapter.log.debug(`process task: ${JSON.stringify(task)}`);\n if (!this.cacheAddedObjects[task.id]) {\n this.cacheAddedObjects[task.id] = true;\n const obj = await this.adapter.getForeignObjectAsync(task.id);\n if (!obj?.common) {\n try {\n await this.adapter.setForeignObjectAsync(task.id, task.data);\n this.adapter.log.info(`New object created: ${task.id}`);\n } catch (err) {\n this.adapter.log.warn(`New object creation error: ${err.message}`);\n }\n } else if (\n obj.common.type !== (task.data as ioBroker.StateObject).common.type ||\n task.storeMap !== undefined\n ) {\n obj.common.type = (task.data as ioBroker.StateObject).common.type;\n try {\n await this.adapter.setForeignObjectAsync(task.id, obj);\n this.adapter.log.info(`Object updated: ${task.id}`);\n } catch (err) {\n this.adapter.log.warn(`Object update error: ${err.message}`);\n }\n }\n }\n if (task.setState) {\n await this._setState(task.id, task.setValue!);\n }\n this.tasks.shift();\n setImmediate(() => this.processTasks());\n }\n\n protected createClient(client: MQTTClient, callback: () => void): void {\n // mqtt.0.cmnd.sonoff.POWER\n // mqtt.0.stat.sonoff.POWER\n const isStart = !this.tasks.length;\n\n const id = `${this.adapter.namespace}.${client.iobId}`;\n const obj: ioBroker.ChannelObject = {\n _id: id,\n common: {\n name: client.id,\n desc: '',\n },\n native: {\n clientId: client.id,\n },\n type: 'channel',\n };\n this.tasks.push({ id: obj._id, data: obj });\n\n const stateObj: ioBroker.StateObject = {\n _id: `${id}.alive`,\n common: {\n type: 'boolean',\n role: 'indicator.reachable',\n read: true,\n write: false,\n name: `${client.id} alive`,\n },\n native: {},\n type: 'state',\n };\n this.tasks.push({ id: stateObj._id, data: stateObj });\n\n if (isStart) {\n this.processTasks(callback).catch(err => this.adapter.log.error(err));\n } else {\n typeof callback === 'function' && callback();\n }\n }\n\n protected async updateClients(): Promise<void> {\n const clientIds = [];\n const clientNames = [];\n if (this.clients) {\n for (const id in this.clients) {\n const oid = `info.clients.${id.replace(/[.\\s]+/g, '_').replace(FORBIDDEN_CHARS, '_')}`;\n clientIds.push(oid);\n clientNames.push(id);\n const clientObj = await this.adapter.getObjectAsync(oid);\n if (!clientObj?.native) {\n await this.adapter.setObjectAsync(oid, {\n type: 'state',\n common: {\n name: id,\n role: 'indicator.reachable',\n type: 'boolean',\n read: true,\n write: false,\n },\n native: {\n ip: this.clients[id].stream.remoteAddress,\n port: this.clients[id].stream.remotePort,\n },\n });\n } else {\n if (\n this.clients[id] &&\n (clientObj.native.port !== this.clients[id].stream.remotePort ||\n clientObj.native.ip !== this.clients[id].stream.remoteAddress)\n ) {\n clientObj.native.port = this.clients[id].stream.remotePort;\n clientObj.native.ip = this.clients[id].stream.remoteAddress;\n await this.adapter.setObjectAsync(clientObj._id, clientObj);\n }\n }\n await this.adapter.setStateAsync(oid, true, true);\n }\n }\n // read all other states and set alive to false\n const allStates = await this.adapter.getStatesAsync('info.clients.*');\n for (const id in allStates) {\n if (!clientIds.includes(id.replace(`${this.adapter.namespace}.`, ''))) {\n await this.adapter.setStateAsync(id, { val: false, ack: true });\n }\n }\n\n await this.updateConnectionState(clientNames);\n }\n\n /**\n * Update info.connection: the server writes the list of the connected clients there,\n * the bridge the URL of the external broker\n */\n protected async updateConnectionState(clientNames: string[]): Promise<void> {\n await this.adapter.setStateAsync('info.connection', clientNames.join(','), true);\n }\n\n protected async updateAlive(client: MQTTClient, alive: boolean): Promise<void> {\n const idAlive = `${this.adapter.namespace}.${client.iobId}.alive`;\n\n const state = await this.adapter.getForeignStateAsync(idAlive);\n if (!state || state.val !== alive) {\n await this.adapter.setForeignStateAsync(idAlive, alive, true);\n }\n }\n\n private addObject(typeKey: string, client: MQTTClient, prefix: string, path: string[]): Task {\n // Extract the actual attribute name for the state ID construction.\n // The path is added to the ID anyway, so it must be removed from the key of the\n // data point, but only if the key really starts with it: \"VEML6075_UvIndex\" in the\n // path \"VEML6075\" is \"UvIndex\", but \"Total_in\" in the path \"SML\" stays \"Total_in\"\n let attr = typeKey;\n const pathPrefix = path.length ? `${path.join('_')}_` : '';\n if (pathPrefix && typeKey.startsWith(pathPrefix)) {\n attr = typeKey.substring(pathPrefix.length);\n }\n const replaceAttr = types[typeKey].replace || attr;\n const id = `${this.adapter.namespace}.${client.iobId}.${prefix ? `${prefix}.` : ''}${path.length ? `${path.join('_')}_` : ''}${replaceAttr.replace(FORBIDDEN_CHARS, '_')}`;\n return {\n id,\n data: {\n _id: id,\n common: {\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`,\n ...types[typeKey],\n },\n native: {},\n type: 'state',\n },\n };\n }\n\n private async syncPowerState(powerId: string, val: ioBroker.StateValue): Promise<void> {\n if (!this.cachePowerObjects[powerId]) {\n const exists = await this.adapter.getForeignObjectAsync(powerId);\n if (exists) {\n this.cachePowerObjects[powerId] = true;\n }\n }\n if (this.cachePowerObjects[powerId]) {\n const state = await this.adapter.getForeignStateAsync(powerId);\n if (!state || state.val != val) {\n this.adapter.log.debug(`Sync .STATE.POWER to .POWER: ${powerId}`);\n this.adapter.setForeignState(powerId, val, true);\n }\n }\n }\n\n private checkData(\n client: MQTTClient,\n topic: string,\n prefix: string,\n data: { [attr: string]: any },\n unit?: { pressureUnit: string; tempUnit: string } | string,\n path?: string[],\n ): void {\n if (!data || typeof data !== 'object') {\n return;\n }\n\n const ledModeReadColorsID = `${this.adapter.namespace}.${client.iobId}.modeReadColors`;\n\n if (this.cachedReadColors[ledModeReadColorsID] === undefined) {\n void this.adapter.getForeignState(ledModeReadColorsID, (err, state) => {\n this.cachedReadColors[ledModeReadColorsID] = !!state?.val;\n setImmediate(() => this.checkData(client, topic, prefix, data, unit, path));\n });\n return;\n }\n\n path ||= [];\n prefix ||= '';\n\n // Extract pressure and temperature units if available at this level for nested data\n const pressureUnit = data.PressureUnit || (unit && typeof unit === 'object' ? unit.pressureUnit : undefined);\n const tempUnit = data.TempUnit || (unit && typeof unit === 'object' ? unit.tempUnit : undefined);\n\n for (const attr in data) {\n if (!Object.prototype.hasOwnProperty.call(data, attr)) {\n this.adapter.log.warn(`[${client.id}] attr error: ${attr}${data[attr]}`);\n continue;\n }\n\n // Skip unit fields - they are used for dynamic unit override, not as states\n if (attr === 'TempUnit' || attr === 'PressureUnit') {\n continue;\n }\n\n if (typeof data[attr] === 'object') {\n // check for arrays\n if (types[attr]) {\n if (types[attr].type === 'array') {\n // transform to an array of attributes\n for (let i = 1; i <= 10; i++) {\n const val = data[attr][i - 1];\n if (typeof val === 'undefined') {\n break;\n }\n // define a new object\n const replaceAttr = attr.replace(FORBIDDEN_CHARS, '_') + i.toString();\n const id = `${this.adapter.namespace}.${client.iobId}.${prefix ? `${prefix}.` : ''}${path.length ? `${path.join('_')}_` : ''}${replaceAttr}`;\n const obj: Task = {\n id,\n data: {\n _id: id,\n common: {\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`,\n ...types[attr],\n type: typeof val as ioBroker.CommonType,\n },\n native: {},\n type: 'state',\n },\n };\n if (\n !['number', 'string', 'boolean'].includes(\n (obj.data as ioBroker.StateObject).common.type,\n )\n ) {\n (obj.data as ioBroker.StateObject).common.type = 'string';\n }\n this.updateState(obj, val);\n }\n } else {\n let nPath: string[] | undefined = [...path];\n nPath.push(attr.replace(FORBIDDEN_CHARS, '_'));\n const nestedUnits = pressureUnit || tempUnit ? { pressureUnit, tempUnit } : unit;\n this.checkData(client, topic, prefix, data[attr], nestedUnits, nPath);\n nPath = undefined;\n }\n } else {\n let nPath: string[] | undefined = [...path];\n nPath.push(attr.replace(FORBIDDEN_CHARS, '_'));\n const nestedUnits = pressureUnit || tempUnit ? { pressureUnit, tempUnit } : unit;\n if (this.config.OBJ_TREE) {\n this.checkData(client, topic, `${prefix}.${nPath.join('.')}`, data[attr], nestedUnits);\n } else {\n this.checkData(client, topic, prefix, data[attr], nestedUnits, nPath);\n }\n nPath = undefined;\n }\n } else if (types[attr] || (path.length > 0 && types[`${path.join('_')}_${attr}`])) {\n let allowReadColors;\n\n // Check for path-based type definition first, then fallback to simple attr type\n const typeKey =\n path.length > 0 && types[`${path.join('_')}_${attr}`] ? `${path.join('_')}_${attr}` : attr;\n\n // create object\n const obj = this.addObject(typeKey, client, prefix, path);\n const replaceAttr = types[typeKey].replace || attr;\n\n if (types[typeKey].storeMap) {\n client._map[replaceAttr] = topic.replace(/^\\w+\\//, 'cmnd/').replace(/\\/\\w+$/, `/${replaceAttr}`);\n }\n\n // handle dynamic pressure unit override\n if (attr === 'Pressure' && pressureUnit && typeof pressureUnit === 'string') {\n (obj.data as ioBroker.StateObject).common.unit = pressureUnit;\n }\n\n // handle dynamic temperature unit override\n if (attr === 'Temperature' && tempUnit && typeof tempUnit === 'string') {\n (obj.data as ioBroker.StateObject).common.unit = tempUnit;\n }\n\n // adaptions for magichome tasmota\n if (attr === 'Color') {\n // read vars\n allowReadColors = this.cachedReadColors[ledModeReadColorsID]; // allow for color read from MQTT (default off)\n\n // if ledFlags bit 2, read color from tasmota, else ignore\n if (data[attr].length === 10) {\n obj.data.common.role = 'level.color.rgbcwww'; // RGB + cold white + white???\n } else if (data[attr].length === 8) {\n obj.data.common.role = 'level.color.rgbww'; // RGB + White\n } else {\n obj.data.common.role = 'level.color.rgb';\n }\n\n if (hueCalc) {\n // Create LEDs modes if required\n let xObj = this.addObject('modeReadColors', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('modeLedExor', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('Hue', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('Saturation', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('Red', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(0, 2), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('Green', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(2, 4), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('Blue', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(4, 6), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('RGB_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n let val = parseInt(data[attr].substring(0, 6), 16);\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n\n if (obj.data.common.role === 'level.color.rgbww') {\n // rgbww\n xObj = this.addObject('WW', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(6, 8), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('WW_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n } else if (obj.data.common.role === 'level.color.rgbcwww') {\n // rgbcwww\n xObj = this.addObject('CW', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(6, 8), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('CW_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n\n xObj = this.addObject('WW', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(8, 10), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('WW_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n val = parseInt(data[attr].substring(8, 10), 16);\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n }\n }\n }\n\n let val: number | string | boolean | undefined;\n if ((obj.data as ioBroker.StateObject).common.type === 'number') {\n val = parseFloat(data[attr]);\n } else if ((obj.data as ioBroker.StateObject).common.type === 'boolean') {\n const _value = (data[attr] || '').toUpperCase();\n val = _value === 'ON' || _value === 'TRUE' || _value === '1';\n } else {\n if (attr === 'Color') {\n // add # char\n if (allowReadColors) {\n val = `#${data[attr]}`;\n }\n } else {\n val = data[attr];\n }\n }\n this.updateState(obj, val);\n\n // Special handling for Zigbee devices: create writable control states for Power and Dimmer\n if (\n (attr === 'Power' || attr === 'Dimmer') &&\n prefix === 'SENSOR' &&\n path.length >= 2 &&\n path[0] === 'ZbReceived'\n ) {\n // Extract device ID from path (e.g., ZbReceived_0x0856_Power -> 0x0856)\n const deviceId = path[1];\n\n // Create a writable control state for Zigbee devices\n const controlObj = Object.assign({}, obj);\n\n // Modify object properties for control state\n if (attr === 'Power') {\n // For Zigbee Power: boolean switch, not power consumption in watts\n controlObj.data.common = {\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.join(' ')} ${attr} Control`,\n };\n // Convert numeric power value (0/1) to boolean for control state\n const controlVal = Boolean(val);\n this.updateState(controlObj, controlVal);\n } else if (attr === 'Dimmer') {\n // For Zigbee Dimmer: ensure it's writable\n (controlObj.data as ioBroker.StateObject).common.write = true;\n controlObj.data.common.name = `${client.id} ${prefix ? `${prefix} ` : ''}${path.join(' ')} ${attr} Control`;\n this.updateState(controlObj, val);\n }\n\n this.adapter.log.debug(`Created Zigbee control state for device ${deviceId}: ${controlObj.id}`);\n }\n\n // Sync .STATE.POWER -> .POWER\n if (obj.id.includes('.STATE.POWER')) {\n const powerId = obj.id.replace('.STATE.POWER', '.POWER');\n this.syncPowerState(powerId, val ?? null).catch(err =>\n this.adapter.log.error(`Cannot sync power states: ${err}`),\n );\n }\n } else {\n // not in list, auto insert\n // tele/sonoff/SENSOR tele/sonoff/STATE => read only\n // stat/sonoff/RESULT => read,write\n\n const parts = topic.split('/');\n // auto generate objects\n if (\n (parts[0] === 'tele' &&\n ((this.config.TELE_SENSOR && parts[2] === 'SENSOR') ||\n (this.config.STAT_RESULT && parts[2] === 'RESULT') ||\n (this.config.TELE_STATE && parts[2] === 'STATE') ||\n (this.config.TELE_MARGINS && parts[2] === 'MARGINS'))) ||\n (parts[0] === 'stat' && this.config.STAT_RESULT && parts[2] === 'RESULT')\n ) {\n let val = data[attr];\n const replaceAttr = attr;\n const attributes: ioBroker.StateCommon = {\n role: 'value',\n read: true,\n write: false,\n type: typeof val as ioBroker.CommonType,\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`,\n };\n\n if (parts[2] === 'RESULT') {\n // control\n attributes.write = true;\n attributes.role = 'level';\n }\n\n if (!['number', 'string', 'boolean'].includes(attributes.type)) {\n attributes.type = 'string';\n val = (val || '').toString();\n }\n\n const id = `${this.adapter.namespace}.${client.iobId}.${prefix ? `${prefix}.` : ''}${path.length ? `${path.join('_')}_` : ''}${replaceAttr}`;\n const obj: Task = {\n id,\n data: {\n _id: id,\n common: attributes,\n native: {},\n type: 'state',\n },\n };\n (obj.data as ioBroker.StateObject).common.name =\n `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`;\n\n this.updateState(obj, val);\n\n // Sync .STATE.POWER -> .POWER\n if (obj.id.includes('.STATE.POWER')) {\n const powerId = obj.id.replace('.STATE.POWER', '.POWER');\n this.syncPowerState(powerId, val ?? null).catch(err =>\n this.adapter.log.error(`Cannot sync power states: ${err}`),\n );\n }\n }\n }\n }\n }\n\n protected async receivedTopic(packet: MQTTPacket, client: MQTTClient): Promise<void> {\n if (!packet) {\n this.adapter.log.warn(`Empty packet received: ${JSON.stringify(packet)}`);\n return;\n }\n\n // Last will topic: \"Online\" is published by the device itself, \"Offline\" by the broker\n // if the device is gone. With the built-in broker the connection state is used instead,\n // but in bridge mode this is the only way to detect that a device disappeared.\n if (packet.topic.endsWith('/LWT')) {\n const lwt = packet.payload.toString('utf8').trim().toLowerCase();\n this.adapter.log.debug(`Client [${client.id}] received: ${packet.topic} = ${lwt}`);\n await this.updateAlive(client, lwt !== 'offline');\n return;\n }\n\n // update alive state\n await this.updateAlive(client, true);\n\n if (client._will?.topic && packet.topic === client._will.topic) {\n client._will.payload = packet.payload;\n return;\n }\n\n let val = packet.payload.toString('utf8');\n this.adapter.log.debug(`Client [${client.id}] received: ${packet.topic} = ${val}`);\n\n client._map ||= {};\n\n const parts = packet.topic.split('/');\n\n client._fallBackName ||= parts[1];\n\n let stateId = parts.pop() || '';\n\n // Handle OpenBeken topics with /get or /set suffix\n // e.g., devicename/led_enableAll/get -> stateId should be led_enableAll\n if ((stateId === 'get' || stateId === 'set') && parts.length > 0) {\n const possibleStateId = parts[parts.length - 1];\n if (possibleStateId && possibleStateId.startsWith('led_') && types[possibleStateId]) {\n stateId = parts.pop() || ''; // Use led_enableAll instead of get/set\n }\n }\n\n if (val.includes('nan')) {\n val = val.replace(/:nan,/g, ':\"NaN\",').replace(/:nan}/g, ':\"NaN\"}').replace(/:nan]/g, ':\"NaN\"]');\n }\n\n if (stateId === 'RESULT') {\n // ignore: stat/Sonoff/RESULT = {\"POWER\":\"ON\"}\n // testserver.js reports error, so reject above cmd\n const str = val.replace(/\\s+/g, '');\n if (str.startsWith('{\"POWER\":\"ON\"}')) {\n return;\n }\n if (str.startsWith('{\"POWER\":\"OFF\"}')) {\n return;\n }\n\n if (parts[0] === 'stat' || parts[0] === 'tele') {\n try {\n if (this.config.OBJ_TREE) {\n this.checkData(client, packet.topic, 'RESULT', JSON.parse(val));\n } else {\n this.checkData(client, packet.topic, NO_PREFIX, JSON.parse(val));\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n }\n return;\n }\n\n // tele/sonoff_4ch/STATE = {\"Time\":\"2017-10-02T19:26:06\", \"Uptime\":0, \"Vcc\":3.226, \"POWER1\":\"OFF\", \"POWER2\":\"OFF\", \"POWER3\":\"OFF\", \"POWER4\":\"OFF\", \"Wifi\":{\"AP\":1, \"SSId\":\"AAA\", \"RSSI\": 15}}\n // tele/sonoff/SENSOR = {\"Time\":\"2017-10-05T17:43:19\", \"DS18x20\":{\"DS1\":{\"Type\":\"DS18B20\", \"Address\":\"28FF9A9876815022A\", \"Temperature\":12.2}}, \"TempUnit\":\"C\"}\n // tele/sonoff5/SENSOR = {\"Time\":\"2017-10-03T14:02:25\", \"AM2301-14\":{\"Temperature\":21.6, \"Humidity\":54.7}, \"TempUnit\":\"C\"}\n // tele/sonoff/SENSOR = {\"Time\":\"2018-02-23T17:36:59\", \"Analog0\":298}\n if (parts[0] === 'tele' && stateId.match(/^(RESULT|STATE|SENSOR|WAKEUP)\\d?$/)) {\n try {\n if (this.config.OBJ_TREE) {\n if (stateId.match(/^(STATE)\\d?$/)) {\n this.checkData(client, packet.topic, 'STATE', JSON.parse(val));\n } else if (stateId.match(/^(SENSOR)\\d?$/)) {\n this.checkData(client, packet.topic, 'SENSOR', JSON.parse(val));\n } else if (stateId.match(/^(WAKEUP)\\d?$/)) {\n this.checkData(client, packet.topic, 'WAKEUP', JSON.parse(val));\n } else if (stateId.match(/^(RESULT)\\d?$/)) {\n this.checkData(client, packet.topic, 'RESULT', JSON.parse(val));\n }\n } else {\n this.checkData(client, packet.topic, NO_PREFIX, JSON.parse(val));\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'tele' && stateId.match(/^INFO\\d?$/)) {\n // tele/SonoffPOW/INFO1 = {\"Module\":\"Sonoff Pow\", \"Version\":\"5.8.0\", \"FallbackTopic\":\"SonoffPOW\", \"GroupTopic\":\"sonoffs\"}\n // tele/SonoffPOW/INFO2 = {\"WebServerMode\":\"Admin\", \"Hostname\":\"Sonoffpow\", \"IPAddress\":\"192.168.2.182\"}\n // tele/SonoffPOW/INFO3 = {\"RestartReason\":\"Software/System restart\"}\n try {\n this.checkData(client, packet.topic, 'INFO', JSON.parse(val));\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'tele' && stateId.match(/^(ENERGY)\\d?$/)) {\n // tele/sonoff_4ch/ENERGY = {\"Time\":\"2017-10-02T19:24:32\", \"Total\":1.753, \"Yesterday\":0.308, \"Today\":0.205, \"Period\":0, \"Power\":3, \"Factor\":0.12, \"Voltage\":221, \"Current\":0.097}\n try {\n this.checkData(client, packet.topic, 'ENERGY', JSON.parse(val));\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'tele' && stateId.match(/^(MARGINS)\\d?$/)) {\n // tele/sonoffPOW/MARGINS = {\"Time\":\"2020-04-23T10:15:00\",\"PowerLow\":100,\"PowerHigh\":2000,\"PowerDelta\":50}\n try {\n this.checkData(client, packet.topic, 'MARGINS', JSON.parse(val));\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'stat' && stateId === 'STATUS10') {\n // stat/device/STATUS10 = {\"StatusSNS\":{\"Time\":\"...\",\"Switch2\":\"ON\",\"Switch3\":\"OFF\",...}}\n // This is the same data as the periodic tele/.../SENSOR telemetry, just requested on demand,\n // so it must land under the exact same state IDs - using \"SENSOR\" here too (with OBJ_TREE\n // on) avoids creating a second, duplicate copy of e.g. the ENERGY reading.\n try {\n const data = JSON.parse(val) as { StatusSNS?: Record<string, unknown> };\n if (data.StatusSNS && typeof data.StatusSNS === 'object') {\n this.checkData(client, packet.topic, this.config.OBJ_TREE ? 'SENSOR' : NO_PREFIX, data.StatusSNS);\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'stat' && stateId === 'STATUS5') {\n // stat/device/STATUS5 = {\"StatusNET\":{\"Hostname\":\"...\",\"IPAddress\":\"...\",...}}\n try {\n const data = JSON.parse(val) as { StatusNET?: Record<string, unknown> };\n if (data.StatusNET && typeof data.StatusNET === 'object') {\n this.checkData(client, packet.topic, 'INFO', data.StatusNET);\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'stat' && stateId === 'STATUS2') {\n // stat/device/STATUS2 = {\"StatusFWR\":{\"Version\":\"...\",\"Hardware\":\"...\",...}}\n try {\n const data = JSON.parse(val) as { StatusFWR?: Record<string, unknown> };\n if (data.StatusFWR && typeof data.StatusFWR === 'object') {\n this.checkData(client, packet.topic, 'INFO', data.StatusFWR);\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (types[stateId]) {\n // /ESP_BOX/BM280/Pressure = 1010.09\n // /ESP_BOX/BM280/Humidity = 42.39\n // /ESP_BOX/BM280/Temperature = 25.86\n // /ESP_BOX/BM280/Approx. Altitude = 24\n\n // cmnd/sonoff/POWER\n // stat/sonoff/POWER\n\n if (types[stateId]) {\n const id = `${this.adapter.namespace}.${client.iobId}.${stateId.replace(/[-.+\\s]+/g, '_').replace(FORBIDDEN_CHARS, '_')}`;\n const obj: Task = {\n id,\n data: {\n _id: id,\n common: {\n name: `${client.id} ${stateId}`,\n ...types[stateId],\n },\n native: {},\n type: 'state',\n },\n };\n\n // push only new objects\n this.updateState(obj, async (): Promise<void> => {\n if ((obj.data as ioBroker.StateObject).common.type === 'number') {\n await this.adapter.setStateAsync(id, parseFloat(val), true);\n } else if ((obj.data as ioBroker.StateObject).common.type === 'boolean') {\n if (val === 'ON' || val === '1' || val === 'true' || val === 'on') {\n await this.adapter.setStateAsync(id, true, true);\n } else if (val === 'OFF' || val === '0' || val === 'false' || val === 'off') {\n await this.adapter.setStateAsync(id, false, true);\n }\n } else {\n await this.adapter.setStateAsync(id, val, true);\n }\n\n // Store topic mapping for state changes\n let mappedTopic = packet.topic;\n if (mappedTopic.endsWith('/get')) {\n // OpenBeken: devicename/led_enableAll/get -> devicename/led_enableAll/set\n mappedTopic = mappedTopic.replace(/\\/get$/, '/set');\n } else if (parts[0] === 'stat' || parts[0] === 'tele') {\n // Convert stat/tele topics to cmnd for outgoing commands.\n // Only the first and the last part are replaced, so nested full topics\n // like tele/house/floor/device/POWER stay intact\n mappedTopic = mappedTopic.replace(/^\\w+\\//, 'cmnd/').replace(/\\/[^/]+$/, `/${stateId}`);\n } else if (stateId.startsWith('led_')) {\n // OpenBeken without suffix: devicename/led_enableAll -> devicename/led_enableAll/set\n mappedTopic = `${packet.topic}/set`;\n }\n client._map[stateId] = mappedTopic;\n });\n } else {\n this.adapter.log.debug(`Cannot process: ${packet.topic}`);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"mqttBase.js","sourceRoot":"","sources":["../../src/lib/mqttBase.ts"],"names":[],"mappings":"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","sourcesContent":["import types, { autoLegacyRoles, autoRoles, legacyRoles } from './datapoints';\nimport type { SonoffAdapterConfig } from '../types';\n\nconst hueCalc = true;\nexport const FORBIDDEN_CHARS = /[\\]\\\\[*,;'\"`<>\\\\?]/g;\nconst NO_PREFIX = '';\n\n/*\n * HSV to RGB color conversion\n *\n * H runs from 0 to 360 degrees\n * S and V run from 0 to 100\n *\n * Ported from the excellent java algorithm by Eugene Vishnevsky at:\n * http://www.cs.rit.edu/~ncs/color/t_convert.html\n */\nfunction hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n let r: number;\n let g: number;\n let b: number;\n\n // Make sure our arguments stay in-range\n h = Math.max(0, Math.min(360, h));\n s = Math.max(0, Math.min(100, s));\n v = Math.max(0, Math.min(100, v));\n\n // We accept saturation and value arguments from 0 to 100 because that's\n // how Photoshop represents those values. Internally, however, the\n // saturation and value are calculated from a range of 0 to 1. We make\n // That conversion here.\n s /= 100;\n v /= 100;\n\n if (s === 0) {\n // Achromatic (grey)\n r = g = b = v;\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n }\n\n h /= 60; // sector 0 to 5\n const i = Math.floor(h);\n const f = h - i; // factorial part of h\n const p = v * (1 - s);\n const q = v * (1 - s * f);\n const t = v * (1 - s * (1 - f));\n\n switch (i) {\n case 0:\n r = v;\n g = t;\n b = p;\n break;\n\n case 1:\n r = q;\n g = v;\n b = p;\n break;\n\n case 2:\n r = p;\n g = v;\n b = t;\n break;\n\n case 3:\n r = p;\n g = q;\n b = v;\n break;\n\n case 4:\n r = t;\n g = p;\n b = v;\n break;\n\n default: // case 5:\n r = v;\n g = p;\n b = q;\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n}\n\nfunction componentToHex(c: number): string {\n const hex = c.toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n}\n\nfunction toPaddedHexString(num: number, len: number): string {\n if (len === 2) {\n if (num > 255) {\n num = 255;\n }\n }\n const str = num.toString(16);\n if (str.length >= len) {\n return str;\n }\n return '0'.repeat(len - str.length) + str;\n}\n\nexport interface MQTTPacket {\n topic: string;\n payload: Buffer | string;\n qos?: 0 | 1 | 2;\n retain?: boolean;\n messageId: number;\n}\n\nexport interface MQTTPacketStored extends MQTTPacket {\n ts: number;\n cmd: 'pubrel' | 'publish';\n count: number;\n}\n\nexport interface MQTTClient {\n __secret: string;\n id: string;\n iobId: string;\n cleanSession: boolean;\n _will?: MQTTPacket;\n _messages: MQTTPacketStored[];\n _subsID: { [key: string]: number };\n _subs: { [key: string]: string[] };\n _resendonStart: ReturnType<typeof setTimeout> | null;\n _map: { [key: string]: string };\n _fallBackName: string;\n /** True as soon as the information of the device (Status 5 and Status 2) was requested */\n _infoRequested?: boolean;\n\n on: (event: string, callback: (args: any) => void) => void;\n connack: (options: { returnCode: number; sessionPresent?: boolean }) => void;\n puback: (options: { messageId: number }) => void;\n pubrec: (options: { messageId: number }) => void;\n pubrel: (options: { messageId: number }) => void;\n pubcomp: (options: { messageId: number }) => void;\n unsuback: (options: { messageId: number }) => void;\n suback: (options: { granted: number[]; messageId: number }) => void;\n pingresp: () => void;\n destroy: () => void;\n publish: (packet: MQTTPacket | MQTTPacket[], cb?: () => void) => void;\n stream: {\n remoteAddress: string;\n remotePort: number;\n };\n}\n\nexport interface Task {\n id: string;\n data: ioBroker.StateObject | ioBroker.ChannelObject;\n storeMap?: boolean;\n setState?: true;\n setValue?: ioBroker.StateValue;\n /** Roles of the older adapter versions: an existing object with one of them gets the role from `data` */\n legacyRoles?: string[];\n}\n\nexport default abstract class MQTTBase {\n protected readonly clients: { [key: string]: MQTTClient } = {};\n protected readonly tasks: Task[] = [];\n protected taskCallbacks: (() => void)[] = [];\n protected mappingClients: { [iobId: string]: string } = {};\n protected readonly adapter: ioBroker.Adapter;\n\n protected readonly cacheAddedObjects: { [id: string]: boolean } = {};\n protected readonly cachedModeExor: { [id: string]: boolean } = {};\n protected readonly cachedReadColors: { [id: string]: boolean } = {};\n protected readonly cachePowerObjects: { [id: string]: true } = {};\n protected readonly specVars = [\n 'Red',\n 'Green',\n 'Blue',\n 'WW',\n 'CW',\n 'Color',\n 'RGB_POWER',\n 'WW_POWER',\n 'CW_POWER',\n 'Hue',\n 'Saturation',\n ];\n protected readonly config: SonoffAdapterConfig;\n\n constructor(adapter: ioBroker.Adapter) {\n this.adapter = adapter;\n this.config = adapter.config as SonoffAdapterConfig;\n this.config.defaultQoS = (parseInt(this.config.defaultQoS as unknown as string, 10) as 0 | 1 | 2) || 0;\n }\n\n protected abstract sendState2Client(\n client: MQTTClient,\n topic: string,\n state: ioBroker.StateValue,\n qos: 0 | 1 | 2,\n ): void;\n\n abstract destroy(): Promise<void>;\n\n private setColor(channelId: string, val: ioBroker.StateValue): void {\n const stateId = 'Color';\n if (this.clients[channelId]?._map?.[stateId]) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n this.clients[channelId]._map[stateId] || 'cmnd/sonoff/Color',\n val,\n this.config.defaultQoS,\n ),\n );\n } else if (this.clients[channelId]?._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/${stateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Unknown mapping for \"${stateId}\"`);\n }\n }\n\n private setPower(channelId: string, val: ioBroker.StateValue): void {\n const stateId = 'POWER';\n if (val === '' || val === null || val === undefined) {\n return this.adapter.log.debug('Empty power was ignored');\n }\n if (this.clients[channelId]._map?.[stateId]) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n this.clients[channelId]._map[stateId] || 'cmnd/sonoff/POWER',\n val ? 'ON' : 'OFF',\n this.config.defaultQoS,\n ),\n );\n } else if (this.clients[channelId]._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/${stateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Unknown mapping for \"${stateId}\"`);\n }\n }\n\n private setZbSendCommand(\n channelId: string,\n deviceId: string,\n attribute: string,\n val: ioBroker.StateValue | undefined,\n ): void {\n // Send Zigbee command via ZbSend\n const zbSendCommand = JSON.stringify({\n device: deviceId,\n send: {\n [attribute]: val,\n },\n });\n\n if (this.clients[channelId]?._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/ZbSend`,\n zbSendCommand,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Cannot send ZbSend command for device ${deviceId}: client not found`);\n }\n }\n\n /**\n * Transform shutter state names to correct Tasmota command format\n * e.g., \"Shutter1_Position\" -> \"ShutterPosition1\"\n * e.g., \"Shutter1_Tilt\" -> \"ShutterTilt1\"\n *\n * @param stateId - The original state ID to transform\n * @returns The transformed state ID for Tasmota commands\n */\n private transformShutterStateId(stateId: string): string {\n const shutterMatch = stateId.match(/^Shutter(\\d+)_(Position|Direction|Target|Tilt)$/);\n if (shutterMatch) {\n const shutterNumber = shutterMatch[1];\n const command = shutterMatch[2];\n return `Shutter${command}${shutterNumber}`;\n }\n return stateId;\n }\n\n private setStateImmediate(channelId: string, stateId: string, val: ioBroker.StateValue): void {\n // Transform shutter state names to correct Tasmota command format\n const transformedStateId = this.transformShutterStateId(stateId);\n\n if (this.clients[channelId]?._map?.[stateId]) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n this.clients[channelId]._map[stateId] || `cmnd/sonoff/${transformedStateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else if (this.clients[channelId]?._fallBackName) {\n setImmediate(() =>\n this.sendState2Client(\n this.clients[channelId],\n `cmnd/${this.clients[channelId]._fallBackName}/${transformedStateId}`,\n val,\n this.config.defaultQoS,\n ),\n );\n } else {\n this.adapter.log.warn(`Unknown mapping for \"${stateId}\"`);\n }\n }\n\n private async _setState(id: string, val: ioBroker.StateValue): Promise<void> {\n this.adapter.log.debug(`Set state after task: ${id}`);\n await this.adapter.setForeignStateAsync(id, val, true);\n }\n\n protected updateState(task: Task, val?: ioBroker.StateValue | (() => void), callback?: () => void): void {\n if (typeof val === 'function') {\n callback = val;\n val = undefined;\n }\n if (val !== undefined) {\n task.setState = true;\n task.setValue = val;\n }\n this.tasks.push(task);\n\n if (callback) {\n this.taskCallbacks.push(callback);\n }\n this.adapter.log.debug(`Update state ${task.id} - ${this.tasks.length}`);\n if (this.tasks.length === 1) {\n this.processTasks().catch(err => this.adapter.log.error(err));\n }\n }\n\n /**\n * Finds the device channel (the `iobId` of its client) a state belongs to. That is not simply the\n * first segment after \"<namespace>.\": the state can be nested (e.g. \"STATE.POWER1\" with \"Create\n * object tree\" on), and a client ID may contain dots itself, as `FORBIDDEN_CHARS` keeps them. So\n * the longest leading path that belongs to a known client wins - the first segment is only the\n * fallback for a client that is not connected.\n *\n * @param id full state ID, e.g. \"sonoff.0.DVES_123456.STATE.POWER1\"\n */\n private getChannelId(id: string): string {\n const parts = id.substring(this.adapter.namespace.length + 1).split('.');\n // The last segment is the data point itself, never part of the channel\n for (let i = parts.length - 1; i > 1; i--) {\n const channelId = parts.slice(0, i).join('.');\n if (this.mappingClients[channelId]) {\n return channelId;\n }\n }\n return parts[0];\n }\n\n private async onStateChangedColors(\n id: string,\n state: ioBroker.State,\n channelId?: string,\n stateId?: string,\n ): Promise<void> {\n if (!channelId) {\n const parts = id.split('.');\n channelId = this.getChannelId(id);\n stateId = parts.pop() || '';\n\n if (\n stateId === 'level' ||\n stateId === 'state' ||\n stateId === 'red' ||\n stateId === 'blue' ||\n stateId === 'green'\n ) {\n stateId = `${parts.pop()}.${stateId}`;\n }\n }\n const ledModeIdExor = `${this.adapter.namespace}.${channelId}.modeLedExor`;\n if (this.cachedModeExor[ledModeIdExor] === undefined) {\n const _state = await this.adapter.getForeignStateAsync(ledModeIdExor);\n this.cachedModeExor[ledModeIdExor] = _state ? (_state.val as boolean) || false : true;\n setImmediate(() => this.onStateChangedColors(id, state, channelId, stateId));\n return;\n }\n\n // ledstripe objects\n const exorWhiteLeds = this.cachedModeExor[ledModeIdExor]; // exor for white leds and color leds => if white leds are switched on, color leds are switched off and vice versa (default on)\n\n // now evaluate ledstripe vars\n // adaptions for magichome tasmota\n if (stateId?.match(/Color\\d?/)) {\n // id = sonoff.0.DVES_96ABFA.Color\n // statid=Color\n // state = {\"val\":\"#faadcf\",\"ack\":false,\"ts\":1520146102580,\"q\":0,\"from\":\"system.this.adapter.web.0\",\"lc\":1520146102580}\n\n // set white to rgb or rgbww\n const obj = await this.adapter.getObjectAsync(id);\n if (!obj) {\n this.adapter.log.warn(`Invalid rgbww obj for ${id}`);\n } else if (typeof state.val !== 'string') {\n this.adapter.log.warn(\n `Invalid rgbww state value for ${id} : ${JSON.stringify(state.val)} needs to be a string`,\n );\n } else {\n const role = obj.common.role;\n let color;\n\n if (role === 'level.color.rgbww') {\n // rgbww\n if (state.val.toUpperCase() === '#FFFFFF') {\n // transform white to WW\n //color='000000FF';\n color = `${state.val.substring(1)}00`;\n } else {\n // strip # char and add ww\n color = `${state.val.substring(1)}00`;\n }\n } else if (role === 'level.color.rgbcwww') {\n color = `${state.val.substring(1)}0000`;\n } else {\n // rgb, strip # char\n color = state.val.substring(1);\n }\n\n this.setColor(channelId, color);\n\n // set rgb too\n const hidE = id.split('.');\n const deviceDesc = `${hidE[0]}.${hidE[1]}.${hidE[2]}`;\n await this.adapter.setStateAsync(\n `${deviceDesc}.Red`,\n (100 * parseInt(color.substring(0, 2), 16)) / 255,\n true,\n );\n await this.adapter.setStateAsync(\n `${deviceDesc}.Green`,\n (100 * parseInt(color.substring(2, 4), 16)) / 255,\n true,\n );\n await this.adapter.setStateAsync(\n `${deviceDesc}.Blue`,\n (100 * parseInt(color.substring(4, 6), 16)) / 255,\n true,\n );\n }\n return;\n }\n\n const hidE = id.split('.');\n const deviceDesc = `${hidE[0]}.${hidE[1]}.${hidE[2]}`;\n if (stateId?.match(/Red\\d?/)) {\n // set red component\n if ((state.val as number) > 100) {\n state.val = 100;\n }\n const red = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace red component\n const out = red + color.substring(2, 10);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n } else if (stateId?.match(/Green\\d?/)) {\n // set green component\n if ((state.val as number) > 100) {\n state.val = 100;\n }\n const green = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace green component\n const out = color.substring(0, 2) + green + color.substring(4, 10);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n return;\n }\n if (stateId?.match(/Blue\\d?/)) {\n // set blue component\n if ((state.val as number) > 100) {\n state.val = 100;\n }\n const blue = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace blue component\n const out = color.substring(0, 4) + blue + color.substring(6, 10);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n return;\n }\n\n if (stateId?.match(/RGB_POWER\\d?/)) {\n // set ww component\n const rgbpow = state.val === 'true' || state.val === true || state.val === 1 || state.val === '1';\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state || typeof _state.val !== 'string') {\n this.adapter.log.info(`Invalid state color for ${idAlive}, correcting value to #000000`);\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val.substring(1);\n let rgb = '000000';\n if (rgbpow) {\n rgb = 'FFFFFF';\n }\n // replace rgb component\n let out = rgb + color.substring(6, 10);\n\n if (rgbpow && exorWhiteLeds) {\n out = `${rgb}0000`;\n let idAlive = `${deviceDesc}.WW_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n idAlive = `${deviceDesc}.WW`;\n await this.adapter.setStateAsync(idAlive, 0, false);\n idAlive = `${deviceDesc}.CW_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n idAlive = `${deviceDesc}.CW`;\n await this.adapter.setStateAsync(idAlive, 0, false);\n }\n this.setColor(channelId, out);\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n if (rgbpow) {\n this.setPower(channelId, true);\n }\n // if led_mode&1, exor white leds\n return;\n }\n\n if (hueCalc && stateId?.match(/Hue\\d?/)) {\n // calc hue + saturation params to rgb\n let hue = state.val as number;\n if (hue > 359) {\n hue = 359;\n }\n // recalc color by hue\n const idAlive = `${deviceDesc}.Dimmer`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n const dim = 100;\n await this.adapter.setStateAsync(idAlive, dim, true);\n } else {\n const dim = _state.val as number;\n const idAlive = `${deviceDesc}.Saturation`;\n const __state = await this.adapter.getForeignStateAsync(idAlive);\n if (!__state) {\n const sat = 100;\n await this.adapter.setStateAsync(idAlive, sat, true);\n } else {\n const sat = __state.val as number;\n const rgb = hsvToRgb(hue, sat, dim);\n const hexVal = componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n const idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${hexVal}`, false);\n }\n }\n return;\n }\n\n if (hueCalc && stateId?.match(/Saturation\\d?/)) {\n let sat = state.val as number;\n if (sat > 100) {\n sat = 100;\n }\n // recalc color by saturation\n const idAlive = `${deviceDesc}.Dimmer`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n const dim = 100;\n await this.adapter.setStateAsync(idAlive, dim, true);\n // this.adapter.log.warn('ill state Dimmer');\n } else {\n const dim = _state.val as number;\n const idAlive = `${deviceDesc}.Hue`;\n const __state = await this.adapter.getForeignStateAsync(idAlive);\n if (!__state) {\n const hue = 100;\n await this.adapter.setStateAsync(idAlive, hue, true);\n } else {\n const hue = __state.val as number;\n const rgb = hsvToRgb(hue, sat, dim);\n const hexVal = componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);\n const idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${hexVal}`, false);\n }\n }\n return;\n }\n\n // get color attributes to check other ledstripe vars\n const idAlive = `${deviceDesc}.Color`;\n const obj = await this.adapter.getForeignObjectAsync(idAlive);\n if (!obj) {\n // no color object\n this.adapter.log.warn(`Unknown object: ${id}: ${JSON.stringify(state)}`);\n } else {\n const role = obj.common.role;\n //if (role='level.color.rgb') return;\n let wwindex;\n if (role === 'level.color.rgbww') {\n wwindex = 6;\n } else {\n wwindex = 8;\n }\n\n if (stateId?.match(/WW_POWER\\d?/)) {\n // set ww component\n const wwpow = state.val === 'true' || state.val === true || state.val === 1 || state.val === '1';\n let idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n this.adapter.log.warn('ill state color');\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n let ww = '00';\n if (wwpow) {\n ww = 'FF';\n }\n // replace ww component\n let out = color.substring(0, wwindex) + ww;\n if (wwpow && exorWhiteLeds) {\n out = `000000${ww}`;\n const idAlive = `${deviceDesc}.RGB_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n }\n\n idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n\n // set ww channel\n idAlive = `${deviceDesc}.WW`;\n await this.adapter.setStateAsync(idAlive, (100 * parseInt(out.substring(6, 8), 16)) / 255, true);\n\n // in case POWER is off, switch it on\n wwpow && this.setPower(channelId, true);\n return;\n }\n\n if (stateId?.match(/CW_POWER\\d?/)) {\n // set ww component\n const cwpow = state.val === 'true' || state.val === true || state.val === 1 || state.val === '1';\n let idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n this.adapter.log.warn('ill state color');\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n let cw = '00';\n if (cwpow) {\n cw = 'FF';\n }\n // replace cw component\n let out = color.substring(0, 6) + cw + color.substring(8, 10);\n if (cwpow && exorWhiteLeds) {\n out = `000000${cw}${color.substring(8, 10)}`;\n const idAlive = `${deviceDesc}.RGB_POWER`;\n await this.adapter.setStateAsync(idAlive, false, false);\n }\n\n idAlive = `${deviceDesc}.Color`;\n await this.adapter.setStateAsync(idAlive, `#${out}`, false);\n this.setColor(channelId, out);\n\n // set cw channel\n idAlive = `${deviceDesc}.CW`;\n await this.adapter.setStateAsync(idAlive, (100 * parseInt(out.substring(6, 8), 16)) / 255, true);\n\n // in case POWER is off, switch it on\n if (cwpow) {\n const idAlive = `${deviceDesc}.POWER`;\n await this.adapter.setStateAsync(idAlive, true, false);\n }\n return;\n }\n\n if (stateId?.match(/WW\\d?/)) {\n // set ww component\n const ww = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace ww component\n const out = color.substring(0, wwindex) + ww;\n this.setColor(channelId, out);\n return;\n }\n\n if (stateId?.match(/CW\\d?/)) {\n // set ww component\n const cw = toPaddedHexString(Math.floor((255 * (state.val as number)) / 100), 2);\n const idAlive = `${deviceDesc}.Color`;\n const _state = await this.adapter.getForeignStateAsync(idAlive);\n if (!_state) {\n await this.adapter.setStateAsync(idAlive, '#000000', false);\n return;\n }\n const color = _state.val?.toString().substring(1) || '000000';\n // replace cw component\n const out = color.substring(0, 6) + cw + color.substring(8, 10);\n this.setColor(channelId, out);\n }\n }\n }\n\n async onStateChange(id: string, state: ioBroker.State): Promise<void> {\n this.adapter.log.debug(`onStateChange ${id}: ${JSON.stringify(state)}`);\n if (state && !state.ack) {\n // find client.id\n const channelId = this.getChannelId(id);\n const stateId = id.split('.').pop() || '';\n\n // Check if this is a Zigbee device state change\n // Pattern: ZbReceived_DEVICEID_ATTRIBUTE (e.g., ZbReceived_0x0856_Power)\n const zbMatch = stateId.match(/^ZbReceived_([^_]+)_(Power|Dimmer)$/);\n if (zbMatch && this.clients[this.mappingClients[channelId]]) {\n const deviceId = zbMatch[1];\n const attribute = zbMatch[2];\n let zbValue: ioBroker.StateValue | undefined;\n\n // Convert values for Zigbee commands\n if (attribute === 'Power') {\n zbValue = state.val ? '1' : '0';\n } else if (attribute === 'Dimmer') {\n zbValue = state.val;\n }\n\n this.adapter.log.debug(`Sending ZbSend command for device ${deviceId}: ${attribute}=${zbValue}`);\n this.setZbSendCommand(this.mappingClients[channelId], deviceId, attribute, zbValue);\n return;\n }\n\n if (this.clients[this.mappingClients[channelId]]) {\n // check for special led-stripe vars\n if (!this.specVars.includes(stateId)) {\n // other objects\n const obj = await this.adapter.getObjectAsync(id);\n if (!obj) {\n this.adapter.log.warn(`Invalid object ${id}`);\n } else {\n const type = obj.common.type;\n switch (type) {\n case 'boolean':\n this.setStateImmediate(\n this.mappingClients[channelId],\n stateId,\n state.val ? 'ON' : 'OFF',\n );\n break;\n case 'number':\n this.setStateImmediate(\n this.mappingClients[channelId],\n stateId,\n state.val === null ? '' : state.val.toString(),\n );\n break;\n case 'string':\n this.setStateImmediate(\n this.mappingClients[channelId],\n stateId,\n state.val === null ? '' : state.val.toString(),\n );\n break;\n }\n }\n } else if (state.val !== null) {\n await this.onStateChangedColors(id, state, channelId, stateId);\n }\n } else {\n if (!this.config.ignoreNotConnectedWarnings) {\n this.adapter.log.info(`Client \"${channelId}\" not connected`);\n }\n }\n }\n }\n\n /**\n * Forgets everything that was cached about the objects of one device, so the next message from it\n * recreates them. `processTasks` creates every object only once per adapter run\n * (`cacheAddedObjects`), so data points that were deleted from outside - e.g. by the device\n * manager's \"delete and recreate all data points\" action - would otherwise never come back until\n * the adapter is restarted.\n *\n * @param deviceId full ID of the device channel, e.g. \"sonoff.0.DVES_123456\"\n */\n public forgetObjects(deviceId: string): void {\n const prefix = `${deviceId}.`;\n const caches: Record<string, unknown>[] = [\n this.cacheAddedObjects,\n this.cachedModeExor,\n this.cachedReadColors,\n this.cachePowerObjects,\n ];\n for (const cache of caches) {\n for (const id of Object.keys(cache)) {\n if (id === deviceId || id.startsWith(prefix)) {\n delete cache[id];\n }\n }\n }\n }\n\n protected async processTasks(callback?: () => void): Promise<void> {\n if (callback) {\n this.taskCallbacks.push(callback);\n }\n if (!this.tasks?.length) {\n const doCallbacks = this.taskCallbacks;\n this.taskCallbacks = [];\n doCallbacks.forEach(cb => typeof cb === 'function' && cb());\n return;\n }\n const task: Task = this.tasks[0];\n this.adapter.log.debug(`process task: ${JSON.stringify(task)}`);\n if (!this.cacheAddedObjects[task.id]) {\n this.cacheAddedObjects[task.id] = true;\n const obj = await this.adapter.getForeignObjectAsync(task.id);\n if (!obj?.common) {\n try {\n await this.adapter.setForeignObjectAsync(task.id, task.data);\n this.adapter.log.info(`New object created: ${task.id}`);\n } catch (err) {\n this.adapter.log.warn(`New object creation error: ${err.message}`);\n }\n } else {\n const common = (task.data as ioBroker.StateObject).common;\n // Objects created by older versions get the current role, so that the type-detector can\n // recognize the device. A role changed by the user is never in the list and stays as it is.\n const updateRole =\n !!common.role &&\n obj.common.role !== common.role &&\n !!task.legacyRoles?.includes(obj.common.role || '');\n\n if (obj.common.type !== common.type || task.storeMap !== undefined || updateRole) {\n obj.common.type = common.type;\n if (updateRole) {\n obj.common.role = common.role;\n obj.common.write = common.write;\n for (const attr of ['unit', 'min', 'max'] as const) {\n if (common[attr] !== undefined) {\n (obj.common as Record<string, unknown>)[attr] = common[attr];\n }\n }\n }\n try {\n await this.adapter.setForeignObjectAsync(task.id, obj);\n this.adapter.log.info(`Object updated: ${task.id}`);\n } catch (err) {\n this.adapter.log.warn(`Object update error: ${err.message}`);\n }\n }\n }\n }\n if (task.setState) {\n await this._setState(task.id, task.setValue!);\n }\n this.tasks.shift();\n setImmediate(() => this.processTasks());\n }\n\n protected createClient(client: MQTTClient, callback: () => void): void {\n // mqtt.0.cmnd.sonoff.POWER\n // mqtt.0.stat.sonoff.POWER\n const isStart = !this.tasks.length;\n\n const id = `${this.adapter.namespace}.${client.iobId}`;\n const obj: ioBroker.ChannelObject = {\n _id: id,\n common: {\n name: client.id,\n desc: '',\n },\n native: {\n clientId: client.id,\n },\n type: 'channel',\n };\n this.tasks.push({ id: obj._id, data: obj });\n\n const stateObj: ioBroker.StateObject = {\n _id: `${id}.alive`,\n common: {\n type: 'boolean',\n role: 'indicator.reachable',\n read: true,\n write: false,\n name: `${client.id} alive`,\n },\n native: {},\n type: 'state',\n };\n this.tasks.push({ id: stateObj._id, data: stateObj });\n\n if (isStart) {\n this.processTasks(callback).catch(err => this.adapter.log.error(err));\n } else {\n typeof callback === 'function' && callback();\n }\n }\n\n protected async updateClients(): Promise<void> {\n const clientIds = [];\n const clientNames = [];\n if (this.clients) {\n for (const id in this.clients) {\n const oid = `info.clients.${id.replace(/[.\\s]+/g, '_').replace(FORBIDDEN_CHARS, '_')}`;\n clientIds.push(oid);\n clientNames.push(id);\n const clientObj = await this.adapter.getObjectAsync(oid);\n if (!clientObj?.native) {\n await this.adapter.setObjectAsync(oid, {\n type: 'state',\n common: {\n name: id,\n role: 'indicator.reachable',\n type: 'boolean',\n read: true,\n write: false,\n },\n native: {\n ip: this.clients[id].stream.remoteAddress,\n port: this.clients[id].stream.remotePort,\n },\n });\n } else {\n if (\n this.clients[id] &&\n (clientObj.native.port !== this.clients[id].stream.remotePort ||\n clientObj.native.ip !== this.clients[id].stream.remoteAddress)\n ) {\n clientObj.native.port = this.clients[id].stream.remotePort;\n clientObj.native.ip = this.clients[id].stream.remoteAddress;\n await this.adapter.setObjectAsync(clientObj._id, clientObj);\n }\n }\n await this.adapter.setStateAsync(oid, true, true);\n }\n }\n // read all other states and set alive to false\n const allStates = await this.adapter.getStatesAsync('info.clients.*');\n for (const id in allStates) {\n if (!clientIds.includes(id.replace(`${this.adapter.namespace}.`, ''))) {\n await this.adapter.setStateAsync(id, { val: false, ack: true });\n }\n }\n\n await this.updateConnectionState(clientNames);\n }\n\n /**\n * Update info.connection: the server writes the list of the connected clients there,\n * the bridge the URL of the external broker\n */\n protected async updateConnectionState(clientNames: string[]): Promise<void> {\n await this.adapter.setStateAsync('info.connection', clientNames.join(','), true);\n }\n\n protected async updateAlive(client: MQTTClient, alive: boolean): Promise<void> {\n const idAlive = `${this.adapter.namespace}.${client.iobId}.alive`;\n\n const state = await this.adapter.getForeignStateAsync(idAlive);\n if (!state || state.val !== alive) {\n await this.adapter.setForeignStateAsync(idAlive, alive, true);\n }\n }\n\n private addObject(typeKey: string, client: MQTTClient, prefix: string, path: string[]): Task {\n // Extract the actual attribute name for the state ID construction.\n // The path is added to the ID anyway, so it must be removed from the key of the\n // data point, but only if the key really starts with it: \"VEML6075_UvIndex\" in the\n // path \"VEML6075\" is \"UvIndex\", but \"Total_in\" in the path \"SML\" stays \"Total_in\"\n let attr = typeKey;\n const pathPrefix = path.length ? `${path.join('_')}_` : '';\n if (pathPrefix && typeKey.startsWith(pathPrefix)) {\n attr = typeKey.substring(pathPrefix.length);\n }\n const replaceAttr = types[typeKey].replace || attr;\n const id = `${this.adapter.namespace}.${client.iobId}.${prefix ? `${prefix}.` : ''}${path.length ? `${path.join('_')}_` : ''}${replaceAttr.replace(FORBIDDEN_CHARS, '_')}`;\n return {\n id,\n data: {\n _id: id,\n common: {\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`,\n ...types[typeKey],\n },\n native: {},\n type: 'state',\n },\n legacyRoles: legacyRoles[typeKey],\n };\n }\n\n private async syncPowerState(powerId: string, val: ioBroker.StateValue): Promise<void> {\n if (!this.cachePowerObjects[powerId]) {\n const exists = await this.adapter.getForeignObjectAsync(powerId);\n if (exists) {\n this.cachePowerObjects[powerId] = true;\n }\n }\n if (this.cachePowerObjects[powerId]) {\n const state = await this.adapter.getForeignStateAsync(powerId);\n if (!state || state.val != val) {\n this.adapter.log.debug(`Sync .STATE.POWER to .POWER: ${powerId}`);\n this.adapter.setForeignState(powerId, val, true);\n }\n }\n }\n\n private checkData(\n client: MQTTClient,\n topic: string,\n prefix: string,\n data: { [attr: string]: any },\n unit?: { pressureUnit: string; tempUnit: string } | string,\n path?: string[],\n ): void {\n if (!data || typeof data !== 'object') {\n return;\n }\n\n const ledModeReadColorsID = `${this.adapter.namespace}.${client.iobId}.modeReadColors`;\n\n if (this.cachedReadColors[ledModeReadColorsID] === undefined) {\n void this.adapter.getForeignState(ledModeReadColorsID, (err, state) => {\n this.cachedReadColors[ledModeReadColorsID] = !!state?.val;\n setImmediate(() => this.checkData(client, topic, prefix, data, unit, path));\n });\n return;\n }\n\n path ||= [];\n prefix ||= '';\n\n // Extract pressure and temperature units if available at this level for nested data\n const pressureUnit = data.PressureUnit || (unit && typeof unit === 'object' ? unit.pressureUnit : undefined);\n const tempUnit = data.TempUnit || (unit && typeof unit === 'object' ? unit.tempUnit : undefined);\n\n for (const attr in data) {\n if (!Object.prototype.hasOwnProperty.call(data, attr)) {\n this.adapter.log.warn(`[${client.id}] attr error: ${attr}${data[attr]}`);\n continue;\n }\n\n // Skip unit fields - they are used for dynamic unit override, not as states\n if (attr === 'TempUnit' || attr === 'PressureUnit') {\n continue;\n }\n\n if (typeof data[attr] === 'object') {\n // check for arrays\n if (types[attr]) {\n if (types[attr].type === 'array') {\n // transform to an array of attributes\n for (let i = 1; i <= 10; i++) {\n const val = data[attr][i - 1];\n if (typeof val === 'undefined') {\n break;\n }\n // define a new object\n const replaceAttr = attr.replace(FORBIDDEN_CHARS, '_') + i.toString();\n const id = `${this.adapter.namespace}.${client.iobId}.${prefix ? `${prefix}.` : ''}${path.length ? `${path.join('_')}_` : ''}${replaceAttr}`;\n const obj: Task = {\n id,\n data: {\n _id: id,\n common: {\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`,\n ...types[attr],\n type: typeof val as ioBroker.CommonType,\n },\n native: {},\n type: 'state',\n },\n };\n if (\n !['number', 'string', 'boolean'].includes(\n (obj.data as ioBroker.StateObject).common.type,\n )\n ) {\n (obj.data as ioBroker.StateObject).common.type = 'string';\n }\n this.updateState(obj, val);\n }\n } else {\n let nPath: string[] | undefined = [...path];\n nPath.push(attr.replace(FORBIDDEN_CHARS, '_'));\n const nestedUnits = pressureUnit || tempUnit ? { pressureUnit, tempUnit } : unit;\n this.checkData(client, topic, prefix, data[attr], nestedUnits, nPath);\n nPath = undefined;\n }\n } else {\n let nPath: string[] | undefined = [...path];\n nPath.push(attr.replace(FORBIDDEN_CHARS, '_'));\n const nestedUnits = pressureUnit || tempUnit ? { pressureUnit, tempUnit } : unit;\n if (this.config.OBJ_TREE) {\n this.checkData(client, topic, `${prefix}.${nPath.join('.')}`, data[attr], nestedUnits);\n } else {\n this.checkData(client, topic, prefix, data[attr], nestedUnits, nPath);\n }\n nPath = undefined;\n }\n } else if (types[attr] || (path.length > 0 && types[`${path.join('_')}_${attr}`])) {\n let allowReadColors;\n\n // Check for path-based type definition first, then fallback to simple attr type\n const typeKey =\n path.length > 0 && types[`${path.join('_')}_${attr}`] ? `${path.join('_')}_${attr}` : attr;\n\n // create object\n const obj = this.addObject(typeKey, client, prefix, path);\n const replaceAttr = types[typeKey].replace || attr;\n\n if (types[typeKey].storeMap) {\n client._map[replaceAttr] = topic.replace(/^\\w+\\//, 'cmnd/').replace(/\\/\\w+$/, `/${replaceAttr}`);\n }\n\n // handle dynamic pressure unit override\n if (attr === 'Pressure' && pressureUnit && typeof pressureUnit === 'string') {\n (obj.data as ioBroker.StateObject).common.unit = pressureUnit;\n }\n\n // handle dynamic temperature unit override\n if (attr === 'Temperature' && tempUnit && typeof tempUnit === 'string') {\n (obj.data as ioBroker.StateObject).common.unit = tempUnit;\n }\n\n // adaptions for magichome tasmota\n if (attr === 'Color') {\n // read vars\n allowReadColors = this.cachedReadColors[ledModeReadColorsID]; // allow for color read from MQTT (default off)\n\n // if ledFlags bit 2, read color from tasmota, else ignore\n if (data[attr].length === 10) {\n obj.data.common.role = 'level.color.rgbcwww'; // RGB + cold white + white???\n } else if (data[attr].length === 8) {\n obj.data.common.role = 'level.color.rgbww'; // RGB + White\n } else {\n obj.data.common.role = 'level.color.rgb';\n }\n\n if (hueCalc) {\n // Create LEDs modes if required\n let xObj = this.addObject('modeReadColors', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('modeLedExor', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('Hue', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('Saturation', client, prefix, path);\n this.updateState(xObj);\n\n xObj = this.addObject('Red', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(0, 2), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('Green', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(2, 4), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('Blue', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(4, 6), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('RGB_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n let val = parseInt(data[attr].substring(0, 6), 16);\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n\n if (obj.data.common.role === 'level.color.rgbww') {\n // rgbww\n xObj = this.addObject('WW', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(6, 8), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('WW_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n } else if (obj.data.common.role === 'level.color.rgbcwww') {\n // rgbcwww\n xObj = this.addObject('CW', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(6, 8), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('CW_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n\n xObj = this.addObject('WW', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n this.updateState(\n xObj,\n allowReadColors ? (100 * parseInt(data[attr].substring(8, 10), 16)) / 255 : undefined,\n );\n\n xObj = this.addObject('WW_POWER', client, prefix, path);\n (xObj.data as ioBroker.StateObject).common.read = allowReadColors;\n val = parseInt(data[attr].substring(8, 10), 16);\n this.updateState(xObj, allowReadColors ? val > 0 : undefined);\n }\n }\n }\n\n let val: number | string | boolean | undefined;\n if ((obj.data as ioBroker.StateObject).common.type === 'number') {\n val = parseFloat(data[attr]);\n } else if ((obj.data as ioBroker.StateObject).common.type === 'boolean') {\n const _value = (data[attr] || '').toUpperCase();\n val = _value === 'ON' || _value === 'TRUE' || _value === '1';\n } else {\n if (attr === 'Color') {\n // add # char\n if (allowReadColors) {\n val = `#${data[attr]}`;\n }\n } else {\n val = data[attr];\n }\n }\n this.updateState(obj, val);\n\n // Special handling for Zigbee devices: create writable control states for Power and Dimmer\n if (\n (attr === 'Power' || attr === 'Dimmer') &&\n prefix === 'SENSOR' &&\n path.length >= 2 &&\n path[0] === 'ZbReceived'\n ) {\n // Extract device ID from path (e.g., ZbReceived_0x0856_Power -> 0x0856)\n const deviceId = path[1];\n\n // Create a writable control state for Zigbee devices\n const controlObj = Object.assign({}, obj);\n\n // Modify object properties for control state\n if (attr === 'Power') {\n // For Zigbee Power: boolean switch, not power consumption in watts\n controlObj.data.common = {\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.join(' ')} ${attr} Control`,\n };\n // Convert numeric power value (0/1) to boolean for control state\n const controlVal = Boolean(val);\n this.updateState(controlObj, controlVal);\n } else if (attr === 'Dimmer') {\n // For Zigbee Dimmer: ensure it's writable\n (controlObj.data as ioBroker.StateObject).common.write = true;\n controlObj.data.common.name = `${client.id} ${prefix ? `${prefix} ` : ''}${path.join(' ')} ${attr} Control`;\n this.updateState(controlObj, val);\n }\n\n this.adapter.log.debug(`Created Zigbee control state for device ${deviceId}: ${controlObj.id}`);\n }\n\n // Sync .STATE.POWER -> .POWER\n if (obj.id.includes('.STATE.POWER')) {\n const powerId = obj.id.replace('.STATE.POWER', '.POWER');\n this.syncPowerState(powerId, val ?? null).catch(err =>\n this.adapter.log.error(`Cannot sync power states: ${err}`),\n );\n }\n } else {\n // not in list, auto insert\n // tele/sonoff/SENSOR tele/sonoff/STATE => read only\n // stat/sonoff/RESULT => read,write\n\n const parts = topic.split('/');\n // auto generate objects\n if (\n (parts[0] === 'tele' &&\n ((this.config.TELE_SENSOR && parts[2] === 'SENSOR') ||\n (this.config.STAT_RESULT && parts[2] === 'RESULT') ||\n (this.config.TELE_STATE && parts[2] === 'STATE') ||\n (this.config.TELE_MARGINS && parts[2] === 'MARGINS'))) ||\n (parts[0] === 'stat' && this.config.STAT_RESULT && parts[2] === 'RESULT')\n ) {\n let val = data[attr];\n const replaceAttr = attr;\n const attributes: ioBroker.StateCommon = {\n role: 'value',\n read: true,\n // RESULT is the answer to a command, so it can be controlled\n write: parts[2] === 'RESULT',\n type: typeof val as ioBroker.CommonType,\n name: `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`,\n };\n\n if (!['number', 'string', 'boolean'].includes(attributes.type)) {\n attributes.type = 'string';\n val = (val || '').toString();\n }\n\n const autoRole = autoRoles[path.length ? `${path.join('_')}_${attr}` : attr];\n if (autoRole) {\n attributes.role = autoRole.role;\n if (autoRole.unit) {\n attributes.unit = autoRole.unit;\n }\n } else if (attributes.type === 'string') {\n attributes.role = 'text';\n } else if (attributes.type === 'boolean') {\n // \"switch\" and \"state\" would be taken by the type-detector for a light or a socket\n attributes.role = attributes.write ? 'switch.setting' : 'indicator';\n } else if (attributes.write) {\n // \"level\" would be taken by the type-detector for a dimmer or a blind\n attributes.role = 'state';\n }\n\n const id = `${this.adapter.namespace}.${client.iobId}.${prefix ? `${prefix}.` : ''}${path.length ? `${path.join('_')}_` : ''}${replaceAttr}`;\n const obj: Task = {\n id,\n data: {\n _id: id,\n common: attributes,\n native: {},\n type: 'state',\n },\n legacyRoles: autoLegacyRoles,\n };\n (obj.data as ioBroker.StateObject).common.name =\n `${client.id} ${prefix ? `${prefix} ` : ''}${path.length ? `${path.join(' ')} ` : ''} ${replaceAttr}`;\n\n this.updateState(obj, val);\n\n // Sync .STATE.POWER -> .POWER\n if (obj.id.includes('.STATE.POWER')) {\n const powerId = obj.id.replace('.STATE.POWER', '.POWER');\n this.syncPowerState(powerId, val ?? null).catch(err =>\n this.adapter.log.error(`Cannot sync power states: ${err}`),\n );\n }\n }\n }\n }\n }\n\n protected async receivedTopic(packet: MQTTPacket, client: MQTTClient): Promise<void> {\n if (!packet) {\n this.adapter.log.warn(`Empty packet received: ${JSON.stringify(packet)}`);\n return;\n }\n\n // Last will topic: \"Online\" is published by the device itself, \"Offline\" by the broker\n // if the device is gone. With the built-in broker the connection state is used instead,\n // but in bridge mode this is the only way to detect that a device disappeared.\n if (packet.topic.endsWith('/LWT')) {\n const lwt = packet.payload.toString('utf8').trim().toLowerCase();\n this.adapter.log.debug(`Client [${client.id}] received: ${packet.topic} = ${lwt}`);\n await this.updateAlive(client, lwt !== 'offline');\n return;\n }\n\n // update alive state\n await this.updateAlive(client, true);\n\n if (client._will?.topic && packet.topic === client._will.topic) {\n client._will.payload = packet.payload;\n return;\n }\n\n let val = packet.payload.toString('utf8');\n this.adapter.log.debug(`Client [${client.id}] received: ${packet.topic} = ${val}`);\n\n client._map ||= {};\n\n const parts = packet.topic.split('/');\n\n client._fallBackName ||= parts[1];\n\n let stateId = parts.pop() || '';\n\n // Handle OpenBeken topics with /get or /set suffix\n // e.g., devicename/led_enableAll/get -> stateId should be led_enableAll\n if ((stateId === 'get' || stateId === 'set') && parts.length > 0) {\n const possibleStateId = parts[parts.length - 1];\n if (possibleStateId && possibleStateId.startsWith('led_') && types[possibleStateId]) {\n stateId = parts.pop() || ''; // Use led_enableAll instead of get/set\n }\n }\n\n if (val.includes('nan')) {\n val = val.replace(/:nan,/g, ':\"NaN\",').replace(/:nan}/g, ':\"NaN\"}').replace(/:nan]/g, ':\"NaN\"]');\n }\n\n if (stateId === 'RESULT') {\n // ignore: stat/Sonoff/RESULT = {\"POWER\":\"ON\"}\n // testserver.js reports error, so reject above cmd\n const str = val.replace(/\\s+/g, '');\n if (str.startsWith('{\"POWER\":\"ON\"}')) {\n return;\n }\n if (str.startsWith('{\"POWER\":\"OFF\"}')) {\n return;\n }\n\n if (parts[0] === 'stat' || parts[0] === 'tele') {\n try {\n if (this.config.OBJ_TREE) {\n this.checkData(client, packet.topic, 'RESULT', JSON.parse(val));\n } else {\n this.checkData(client, packet.topic, NO_PREFIX, JSON.parse(val));\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n }\n return;\n }\n\n // tele/sonoff_4ch/STATE = {\"Time\":\"2017-10-02T19:26:06\", \"Uptime\":0, \"Vcc\":3.226, \"POWER1\":\"OFF\", \"POWER2\":\"OFF\", \"POWER3\":\"OFF\", \"POWER4\":\"OFF\", \"Wifi\":{\"AP\":1, \"SSId\":\"AAA\", \"RSSI\": 15}}\n // tele/sonoff/SENSOR = {\"Time\":\"2017-10-05T17:43:19\", \"DS18x20\":{\"DS1\":{\"Type\":\"DS18B20\", \"Address\":\"28FF9A9876815022A\", \"Temperature\":12.2}}, \"TempUnit\":\"C\"}\n // tele/sonoff5/SENSOR = {\"Time\":\"2017-10-03T14:02:25\", \"AM2301-14\":{\"Temperature\":21.6, \"Humidity\":54.7}, \"TempUnit\":\"C\"}\n // tele/sonoff/SENSOR = {\"Time\":\"2018-02-23T17:36:59\", \"Analog0\":298}\n if (parts[0] === 'tele' && stateId.match(/^(RESULT|STATE|SENSOR|WAKEUP)\\d?$/)) {\n try {\n if (this.config.OBJ_TREE) {\n if (stateId.match(/^(STATE)\\d?$/)) {\n this.checkData(client, packet.topic, 'STATE', JSON.parse(val));\n } else if (stateId.match(/^(SENSOR)\\d?$/)) {\n this.checkData(client, packet.topic, 'SENSOR', JSON.parse(val));\n } else if (stateId.match(/^(WAKEUP)\\d?$/)) {\n this.checkData(client, packet.topic, 'WAKEUP', JSON.parse(val));\n } else if (stateId.match(/^(RESULT)\\d?$/)) {\n this.checkData(client, packet.topic, 'RESULT', JSON.parse(val));\n }\n } else {\n this.checkData(client, packet.topic, NO_PREFIX, JSON.parse(val));\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'tele' && stateId.match(/^INFO\\d?$/)) {\n // tele/SonoffPOW/INFO1 = {\"Module\":\"Sonoff Pow\", \"Version\":\"5.8.0\", \"FallbackTopic\":\"SonoffPOW\", \"GroupTopic\":\"sonoffs\"}\n // tele/SonoffPOW/INFO2 = {\"WebServerMode\":\"Admin\", \"Hostname\":\"Sonoffpow\", \"IPAddress\":\"192.168.2.182\"}\n // tele/SonoffPOW/INFO3 = {\"RestartReason\":\"Software/System restart\"}\n try {\n this.checkData(client, packet.topic, 'INFO', JSON.parse(val));\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'tele' && stateId.match(/^(ENERGY)\\d?$/)) {\n // tele/sonoff_4ch/ENERGY = {\"Time\":\"2017-10-02T19:24:32\", \"Total\":1.753, \"Yesterday\":0.308, \"Today\":0.205, \"Period\":0, \"Power\":3, \"Factor\":0.12, \"Voltage\":221, \"Current\":0.097}\n try {\n this.checkData(client, packet.topic, 'ENERGY', JSON.parse(val));\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'tele' && stateId.match(/^(MARGINS)\\d?$/)) {\n // tele/sonoffPOW/MARGINS = {\"Time\":\"2020-04-23T10:15:00\",\"PowerLow\":100,\"PowerHigh\":2000,\"PowerDelta\":50}\n try {\n this.checkData(client, packet.topic, 'MARGINS', JSON.parse(val));\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data\"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'stat' && stateId === 'STATUS10') {\n // stat/device/STATUS10 = {\"StatusSNS\":{\"Time\":\"...\",\"Switch2\":\"ON\",\"Switch3\":\"OFF\",...}}\n // This is the same data as the periodic tele/.../SENSOR telemetry, just requested on demand,\n // so it must land under the exact same state IDs - using \"SENSOR\" here too (with OBJ_TREE\n // on) avoids creating a second, duplicate copy of e.g. the ENERGY reading.\n try {\n const data = JSON.parse(val) as { StatusSNS?: Record<string, unknown> };\n if (data.StatusSNS && typeof data.StatusSNS === 'object') {\n this.checkData(client, packet.topic, this.config.OBJ_TREE ? 'SENSOR' : NO_PREFIX, data.StatusSNS);\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'stat' && stateId === 'STATUS5') {\n // stat/device/STATUS5 = {\"StatusNET\":{\"Hostname\":\"...\",\"IPAddress\":\"...\",...}}\n try {\n const data = JSON.parse(val) as { StatusNET?: Record<string, unknown> };\n if (data.StatusNET && typeof data.StatusNET === 'object') {\n this.checkData(client, packet.topic, 'INFO', data.StatusNET);\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (parts[0] === 'stat' && stateId === 'STATUS2') {\n // stat/device/STATUS2 = {\"StatusFWR\":{\"Version\":\"...\",\"Hardware\":\"...\",...}}\n try {\n const data = JSON.parse(val) as { StatusFWR?: Record<string, unknown> };\n if (data.StatusFWR && typeof data.StatusFWR === 'object') {\n this.checkData(client, packet.topic, 'INFO', data.StatusFWR);\n }\n } catch (e) {\n this.adapter.log.warn(`Client [${client.id}] cannot parse data \"${stateId}\": _${val}_ - ${e}`);\n }\n } else if (types[stateId]) {\n // /ESP_BOX/BM280/Pressure = 1010.09\n // /ESP_BOX/BM280/Humidity = 42.39\n // /ESP_BOX/BM280/Temperature = 25.86\n // /ESP_BOX/BM280/Approx. Altitude = 24\n\n // cmnd/sonoff/POWER\n // stat/sonoff/POWER\n\n if (types[stateId]) {\n const id = `${this.adapter.namespace}.${client.iobId}.${stateId.replace(/[-.+\\s]+/g, '_').replace(FORBIDDEN_CHARS, '_')}`;\n const obj: Task = {\n id,\n data: {\n _id: id,\n common: {\n name: `${client.id} ${stateId}`,\n ...types[stateId],\n },\n native: {},\n type: 'state',\n },\n legacyRoles: legacyRoles[stateId],\n };\n\n // push only new objects\n this.updateState(obj, async (): Promise<void> => {\n if ((obj.data as ioBroker.StateObject).common.type === 'number') {\n await this.adapter.setStateAsync(id, parseFloat(val), true);\n } else if ((obj.data as ioBroker.StateObject).common.type === 'boolean') {\n if (val === 'ON' || val === '1' || val === 'true' || val === 'on') {\n await this.adapter.setStateAsync(id, true, true);\n } else if (val === 'OFF' || val === '0' || val === 'false' || val === 'off') {\n await this.adapter.setStateAsync(id, false, true);\n }\n } else {\n await this.adapter.setStateAsync(id, val, true);\n }\n\n // Store topic mapping for state changes\n let mappedTopic = packet.topic;\n if (mappedTopic.endsWith('/get')) {\n // OpenBeken: devicename/led_enableAll/get -> devicename/led_enableAll/set\n mappedTopic = mappedTopic.replace(/\\/get$/, '/set');\n } else if (parts[0] === 'stat' || parts[0] === 'tele') {\n // Convert stat/tele topics to cmnd for outgoing commands.\n // Only the first and the last part are replaced, so nested full topics\n // like tele/house/floor/device/POWER stay intact\n mappedTopic = mappedTopic.replace(/^\\w+\\//, 'cmnd/').replace(/\\/[^/]+$/, `/${stateId}`);\n } else if (stateId.startsWith('led_')) {\n // OpenBeken without suffix: devicename/led_enableAll -> devicename/led_enableAll/set\n mappedTopic = `${packet.topic}/set`;\n }\n client._map[stateId] = mappedTopic;\n });\n } else {\n this.adapter.log.debug(`Cannot process: ${packet.topic}`);\n }\n }\n }\n}\n"]}