iobroker.sonoff 3.3.0 → 4.2.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.
- package/LICENSE +1 -1
- package/README.md +96 -170
- package/admin/i18n/{de/translations.json → de.json} +37 -12
- package/admin/i18n/{en/translations.json → en.json} +37 -12
- package/admin/i18n/{es/translations.json → es.json} +37 -12
- package/admin/i18n/{fr/translations.json → fr.json} +37 -12
- package/admin/i18n/{it/translations.json → it.json} +37 -12
- package/admin/i18n/{nl/translations.json → nl.json} +37 -12
- package/admin/i18n/{pl/translations.json → pl.json} +37 -12
- package/admin/i18n/{pt/translations.json → pt.json} +37 -12
- package/admin/i18n/{ru/translations.json → ru.json} +37 -12
- package/admin/i18n/{uk/translations.json → uk.json} +37 -12
- package/admin/i18n/{zh-cn/translations.json → zh-cn.json} +37 -12
- package/admin/jsonConfig.json +427 -228
- package/build/lib/bridge.js +512 -0
- package/build/lib/bridge.js.map +1 -0
- package/build/lib/checkStates.js +68 -0
- package/build/lib/checkStates.js.map +1 -0
- package/{lib → build/lib}/datapoints.js +61 -1
- package/build/lib/datapoints.js.map +1 -0
- package/build/lib/deviceManager.js +898 -0
- package/build/lib/deviceManager.js.map +1 -0
- package/build/lib/i18n/de.json +61 -0
- package/build/lib/i18n/en.json +61 -0
- package/build/lib/i18n/es.json +61 -0
- package/build/lib/i18n/fr.json +61 -0
- package/build/lib/i18n/it.json +61 -0
- package/build/lib/i18n/nl.json +61 -0
- package/build/lib/i18n/pl.json +61 -0
- package/build/lib/i18n/pt.json +61 -0
- package/build/lib/i18n/ru.json +61 -0
- package/build/lib/i18n/uk.json +61 -0
- package/build/lib/i18n/zh-cn.json +61 -0
- package/build/lib/mqttBase.js +1308 -0
- package/build/lib/mqttBase.js.map +1 -0
- package/build/lib/server.js +485 -0
- package/build/lib/server.js.map +1 -0
- package/build/main.js +110 -0
- package/build/main.js.map +1 -0
- package/io-package.json +47 -30
- package/package.json +26 -21
- package/admin/index.html +0 -177
- package/admin/index_m.html +0 -218
- package/admin/words.js +0 -75
- package/lib/server.js +0 -2086
- package/main.js +0 -104
|
@@ -0,0 +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"]}
|