diff --git a/README.md b/README.md index 81b2d4f..81cf165 100644 --- a/README.md +++ b/README.md @@ -19,13 +19,24 @@ Was geht: - Server und Clientmodus für MQTT - Es gibt je Gerät einen Anwesenheitsdatenpunkt - incl. Adminkonfiguration ab welcher Abwesenheitszeit dieser auf false gehen soll. Aktualisierung im espresense muß natürlich kleiner sein als diese Zeit. - Datenpunkte unterhalb von devices. werden nach 30 Tagen inaktivität entfernt -- Datenpunkt werden aktualisiert auch wenn der Wert gleich bleibt. +- Datenpunkte werden immer aktualisiert wenn Daten rein kommen. +- Datenpunkte unter rooms die beschreibbar sind, werden an den ESP gesendet zur Konfiguration +- Filtern muß aktuell vom ESP übernommen werden. + +Noch zu tun: +- Filter über den Admin konfigurierbar machen, die 30 Tage entfernen und alle Geräte, die nicht ausgewählt sind, ignorieren. +- Name der States hinzufügen (rooms.folder z.B. ist nur ein Token) + +Noch zu tun ## Changelog +### **WORK IN PROGRESS** +* (ticaki) Added: send configuration datapoints to esp + ### 0.0.3 (2023-12-19) * (ticaki) Added: Mqtt Server with file db diff --git a/build/lib/definition.js b/build/lib/definition.js index a2c619d..0e1575a 100644 --- a/build/lib/definition.js +++ b/build/lib/definition.js @@ -73,7 +73,7 @@ const genericStateObjects = { _id: "", type: "folder", common: { - name: "devises" + name: "devices.folder" }, native: {} }, @@ -81,15 +81,15 @@ const genericStateObjects = { _id: "", type: "folder", common: { - name: "devises" + name: "rooms.folder" }, native: {} }, - configs: { + settings: { _id: "", type: "folder", common: { - name: "devises" + name: "settings.folder" }, native: {} } @@ -124,7 +124,7 @@ const statesObjects = { type: "string", role: "text", read: true, - write: true + write: false }, native: {} }, @@ -136,7 +136,7 @@ const statesObjects = { type: "string", role: "text", read: true, - write: true + write: false }, native: {} }, @@ -148,7 +148,7 @@ const statesObjects = { type: "string", role: "text", read: true, - write: true + write: false }, native: {} }, @@ -247,7 +247,7 @@ const statesObjects = { type: "string", role: "text", read: true, - write: true + write: false }, native: {} }, @@ -261,7 +261,9 @@ const statesObjects = { read: true, write: true }, - native: {} + native: { + convert: 'val ? "ON" : "OFF"' + } }, auto_update: { _id: "", @@ -273,7 +275,9 @@ const statesObjects = { read: true, write: true }, - native: {} + native: { + convert: 'val ? "ON" : "OFF"' + } }, prerelease: { _id: "", @@ -285,7 +289,9 @@ const statesObjects = { read: true, write: true }, - native: {} + native: { + convert: 'val ? "ON" : "OFF"' + } }, motion: { _id: "", @@ -400,7 +406,7 @@ const statesObjects = { _id: "", type: "channel", common: { - name: "room.channel" + name: "room.led_1.channel" }, native: {} }, @@ -412,7 +418,7 @@ const statesObjects = { type: "boolean", role: "switch", read: true, - write: true + write: false }, native: {} } @@ -422,7 +428,7 @@ const statesObjects = { _id: "", type: "channel", common: { - name: "room.channel" + name: "room.telemetry.channel" }, native: {} }, diff --git a/build/lib/definition.js.map b/build/lib/definition.js.map index eef8d15..65f70a1 100644 --- a/build/lib/definition.js.map +++ b/build/lib/definition.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/lib/definition.ts"], - "sourcesContent": ["import { settings, device, room } from './types-d';\n\nexport type ChangeTypeToChannelAndState = Obj extends object\n ? {\n [K in keyof Obj]-?: ChangeTypeToChannelAndState;\n } & customChannelType\n : ioBroker.StateObject;\nexport type ChangeToChannel = Obj extends object\n ? { [K in keyof Obj]-?: customChannelType & T }\n : ioBroker.StateObject;\n\nexport type ChangeTypeOfKeys = Obj extends object ? { [K in keyof Obj]-?: ChangeTypeOfKeys } : N;\n\nexport type customChannelType = {\n _channel: ioBroker.ChannelObject | ioBroker.DeviceObject;\n};\n\nexport const defaultChannel: ioBroker.ChannelObject = {\n _id: '',\n type: 'channel',\n common: {\n name: 'Hey no description... ',\n },\n native: {},\n};\n\nexport type statesObjectsType = {\n state: ioBroker.StateObject;\n rooms: customChannelType | ChangeTypeToChannelAndState;\n devices: customChannelType | ChangeTypeToChannelAndState;\n settings: customChannelType & { config: customChannelType | ChangeTypeToChannelAndState };\n};\n\nexport const genericStateObjects: {\n default: ioBroker.StateObject;\n customString: ioBroker.StateObject;\n devices: ioBroker.FolderObject;\n rooms: ioBroker.FolderObject;\n configs: ioBroker.FolderObject;\n presense: ioBroker.StateObject;\n} = {\n default: {\n _id: 'No_definition',\n type: 'state',\n common: {\n name: 'genericStateObjects.state',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n presense: {\n _id: '',\n type: 'state',\n common: {\n name: 'genericStateObjects.presense',\n type: 'boolean',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n customString: {\n _id: 'User_State',\n type: 'state',\n common: {\n name: 'genericStateObjects.customString',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n devices: {\n _id: '',\n type: 'folder',\n common: {\n name: 'devises',\n },\n native: {},\n },\n rooms: {\n _id: '',\n type: 'folder',\n common: {\n name: 'devises',\n },\n native: {},\n },\n configs: {\n _id: '',\n type: 'folder',\n common: {\n name: 'devises',\n },\n native: {},\n },\n};\nexport const statesObjects: statesObjectsType = {\n state: {\n _id: 'No_definition',\n type: 'state',\n common: {\n name: 'genericStateObjects.state',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n rooms: {\n _channel: {\n _id: '',\n type: 'device',\n common: {\n name: 'room.channel',\n },\n native: {},\n },\n known_irks: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.known_irks',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n known_macs: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.known_macs',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n query: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.query',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n exclude: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.exclude',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n status: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.status',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n max_distance: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.distance',\n type: 'number',\n role: 'value',\n unit: 'm',\n read: true,\n write: true,\n },\n native: {},\n },\n absorption: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.absorption',\n type: 'number',\n role: 'value',\n read: true,\n write: true,\n },\n native: {},\n },\n tx_ref_rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.tx_ref_rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n rx_adj_rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.rx_adj_rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n include: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.include',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n count_ids: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.count_ids',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n arduino_ota: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.arduino_ota',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {},\n },\n auto_update: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.auto_update',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {},\n },\n prerelease: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.prerelease',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {},\n },\n motion: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.motion',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n switch: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.switch',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n button: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.button',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n pir_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.pri_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n radar_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.radar_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n switch_1_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.switch_1_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n switch_2_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.switch_2_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n button_1_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.button_1_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n button_2_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.button_2_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n led_1: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'room.channel',\n },\n native: {},\n },\n state: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.led_1',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {},\n },\n },\n telemetry: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'room.channel',\n },\n native: {},\n },\n ip: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.ip',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n uptime: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.uptime',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n firm: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.firm',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n ver: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.ver',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n count: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.count',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n adverts: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.adverts',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n seen: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.seen',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n reported: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.reported',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n freeHeap: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.freeheap',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n maxHeap: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.maxHeap',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n scanStack: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.scanStack',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n loopStack: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.loopStack',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n bleStack: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.bleStack',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n },\n devices: {\n _channel: {\n _id: '',\n type: 'device',\n common: {\n name: 'devices.channel',\n },\n native: {},\n },\n mac: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.mac',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n id: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.id',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n name: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.name',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n disc: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.disc',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n idType: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.idType',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n 'rssi@1m': {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.rssi@1m',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n raw: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.raw',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n distance: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.distance',\n type: 'number',\n role: 'value',\n unit: 'm',\n read: true,\n write: false,\n },\n native: {},\n },\n int: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.int',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n close: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.close',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n settings: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'settings.channel',\n },\n native: {},\n },\n config: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'settings.config.channel',\n },\n native: {},\n },\n id: {\n _id: '',\n type: 'state',\n common: {\n name: 'settings.config.id',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n name: {\n _id: '',\n type: 'state',\n common: {\n name: 'settings.config.name',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n },\n};\n\nexport const Defaults = {\n state: {\n _id: 'No_definition',\n type: 'state',\n common: {\n name: 'No definition',\n\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n};\n"], - "mappings": "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", + "sourcesContent": ["import { settings, device, room } from './types-d';\n\nexport type ChangeTypeToChannelAndState = Obj extends object\n ? {\n [K in keyof Obj]-?: ChangeTypeToChannelAndState;\n } & customChannelType\n : ioBroker.StateObject;\nexport type ChangeToChannel = Obj extends object\n ? { [K in keyof Obj]-?: customChannelType & T }\n : ioBroker.StateObject;\n\nexport type ChangeTypeOfKeys = Obj extends object ? { [K in keyof Obj]-?: ChangeTypeOfKeys } : N;\n\nexport type customChannelType = {\n _channel: ioBroker.ChannelObject | ioBroker.DeviceObject;\n};\n\nexport const defaultChannel: ioBroker.ChannelObject = {\n _id: '',\n type: 'channel',\n common: {\n name: 'Hey no description... ',\n },\n native: {},\n};\n\nexport type statesObjectsType = {\n state: ioBroker.StateObject;\n rooms: customChannelType | ChangeTypeToChannelAndState;\n devices: customChannelType | ChangeTypeToChannelAndState;\n settings: customChannelType & { config: customChannelType | ChangeTypeToChannelAndState };\n};\n\nexport const genericStateObjects: {\n default: ioBroker.StateObject;\n customString: ioBroker.StateObject;\n devices: ioBroker.FolderObject;\n rooms: ioBroker.FolderObject;\n settings: ioBroker.FolderObject;\n presense: ioBroker.StateObject;\n} = {\n default: {\n _id: 'No_definition',\n type: 'state',\n common: {\n name: 'genericStateObjects.state',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n presense: {\n _id: '',\n type: 'state',\n common: {\n name: 'genericStateObjects.presense',\n type: 'boolean',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n customString: {\n _id: 'User_State',\n type: 'state',\n common: {\n name: 'genericStateObjects.customString',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n devices: {\n _id: '',\n type: 'folder',\n common: {\n name: 'devices.folder',\n },\n native: {},\n },\n rooms: {\n _id: '',\n type: 'folder',\n common: {\n name: 'rooms.folder',\n },\n native: {},\n },\n settings: {\n _id: '',\n type: 'folder',\n common: {\n name: 'settings.folder',\n },\n native: {},\n },\n};\nexport const statesObjects: statesObjectsType = {\n state: {\n _id: 'No_definition',\n type: 'state',\n common: {\n name: 'genericStateObjects.state',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n rooms: {\n _channel: {\n _id: '',\n type: 'device',\n common: {\n name: 'room.channel',\n },\n native: {},\n },\n known_irks: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.known_irks',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n known_macs: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.known_macs',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n query: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.query',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n exclude: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.exclude',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n status: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.status',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n max_distance: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.distance',\n type: 'number',\n role: 'value',\n unit: 'm',\n read: true,\n write: true,\n },\n native: {},\n },\n absorption: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.absorption',\n type: 'number',\n role: 'value',\n read: true,\n write: true,\n },\n native: {},\n },\n tx_ref_rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.tx_ref_rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n rx_adj_rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.rx_adj_rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n include: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.include',\n type: 'string',\n role: 'text',\n read: true,\n write: true,\n },\n native: {},\n },\n count_ids: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.count_ids',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n arduino_ota: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.arduino_ota',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {\n convert: 'val ? \"ON\" : \"OFF\"',\n },\n },\n auto_update: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.auto_update',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {\n convert: 'val ? \"ON\" : \"OFF\"',\n },\n },\n prerelease: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.prerelease',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: true,\n },\n native: {\n convert: 'val ? \"ON\" : \"OFF\"',\n },\n },\n motion: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.motion',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n switch: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.switch',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n button: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.button',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n pir_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.pri_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n radar_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.radar_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n switch_1_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.switch_1_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n switch_2_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.switch_2_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n button_1_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.button_1_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n button_2_timeout: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.button_2_timeout',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n led_1: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'room.led_1.channel',\n },\n native: {},\n },\n state: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.led_1',\n type: 'boolean',\n role: 'switch',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n telemetry: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'room.telemetry.channel',\n },\n native: {},\n },\n ip: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.ip',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n uptime: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.uptime',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n firm: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.firm',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n ver: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.ver',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n count: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.count',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n adverts: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.adverts',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n seen: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.seen',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n reported: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.reported',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n freeHeap: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.freeheap',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n maxHeap: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.maxHeap',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n scanStack: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.scanStack',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n loopStack: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.loopStack',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n bleStack: {\n _id: '',\n type: 'state',\n common: {\n name: 'room.telemetry.bleStack',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n },\n devices: {\n _channel: {\n _id: '',\n type: 'device',\n common: {\n name: 'devices.channel',\n },\n native: {},\n },\n mac: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.mac',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n id: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.id',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n name: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.name',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n disc: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.disc',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n idType: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.idType',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n 'rssi@1m': {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.rssi@1m',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n rssi: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.rssi',\n type: 'number',\n role: 'value',\n unit: 'db',\n read: true,\n write: false,\n },\n native: {},\n },\n raw: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.raw',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n distance: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.distance',\n type: 'number',\n role: 'value',\n unit: 'm',\n read: true,\n write: false,\n },\n native: {},\n },\n int: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.int',\n type: 'number',\n role: 'value',\n read: true,\n write: false,\n },\n native: {},\n },\n close: {\n _id: '',\n type: 'state',\n common: {\n name: 'devices.close',\n type: 'boolean',\n role: 'indicator',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n settings: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'settings.channel',\n },\n native: {},\n },\n config: {\n _channel: {\n _id: '',\n type: 'channel',\n common: {\n name: 'settings.config.channel',\n },\n native: {},\n },\n id: {\n _id: '',\n type: 'state',\n common: {\n name: 'settings.config.id',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n name: {\n _id: '',\n type: 'state',\n common: {\n name: 'settings.config.name',\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n },\n },\n};\n\nexport const Defaults = {\n state: {\n _id: 'No_definition',\n type: 'state',\n common: {\n name: 'No definition',\n\n type: 'string',\n role: 'text',\n read: true,\n write: false,\n },\n native: {},\n },\n};\n"], + "mappings": "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", "names": [] } diff --git a/build/lib/library.js b/build/lib/library.js index 590bb3a..0fbb380 100644 --- a/build/lib/library.js +++ b/build/lib/library.js @@ -207,7 +207,7 @@ class Library extends BaseClass { if (!del) await this.adapter.extendObjectAsync(dp, obj); const stateType = obj && obj.common && obj.common.type; - node = this.setdb(dp, obj.type, void 0, stateType, true); + node = this.setdb(dp, obj.type, void 0, stateType, true, Date.now(), obj); } else if (node.init && obj) { if (typeof obj.common.name == "string") obj.common.name = await this.getTranslationObj(obj.common.name); @@ -308,13 +308,14 @@ class Library extends BaseClass { readdp(dp) { return this.stateDataBase[this.cleandp(dp)]; } - setdb(dp, type, val, stateType, ack = true, ts = Date.now(), init = false) { + setdb(dp, type, val, stateType, ack = true, ts = Date.now(), obj = void 0, init = false) { this.stateDataBase[dp] = { type, stateTyp: stateType !== void 0 ? stateType : this.stateDataBase[dp] !== void 0 && this.stateDataBase[dp].stateTyp !== void 0 ? this.stateDataBase[dp].stateTyp : void 0, val, ack, ts: ts ? ts : Date.now(), + obj: obj !== void 0 ? obj : this.stateDataBase[dp] !== void 0 && this.stateDataBase[dp].obj !== void 0 ? this.stateDataBase[dp].obj : void 0, init }; return this.stateDataBase[dp]; @@ -358,6 +359,7 @@ class Library extends BaseClass { obj && obj.common && obj.common.type ? obj.common.type : void 0, states[state] && states[state].ack, states[state] && states[state].ts ? states[state].ts : Date.now(), + obj == null ? void 0 : obj, true ); } else { diff --git a/build/lib/library.js.map b/build/lib/library.js.map index ebfe019..fc07e23 100644 --- a/build/lib/library.js.map +++ b/build/lib/library.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/lib/library.ts"], - "sourcesContent": ["import _fs from 'fs';\nimport { genericStateObjects, statesObjectsType } from './definition';\nimport { Espresense } from '../main';\n\n// only change this for other adapters\nexport type AdapterClassDefinition = Espresense;\n\ntype LibraryStateVal = LibraryStateValJson | undefined;\ntype LibraryStateValJson = {\n type: ioBroker.ObjectType;\n stateTyp: string | undefined;\n val: ioBroker.StateValue | undefined;\n ts: number;\n ack: boolean;\n init: boolean;\n};\n\n// Generic library module and base classes, do not insert specific adapter code here.\n\n/**\n * Base class with this.log function\n */\nexport class BaseClass {\n unload: boolean = false;\n log: CustomLog;\n adapter: AdapterClassDefinition;\n library: Library;\n name: string = ``;\n constructor(adapter: AdapterClassDefinition, name: string = '') {\n this.name = name;\n this.log = new CustomLog(adapter, this.name);\n this.adapter = adapter;\n this.library = adapter.library;\n }\n async delete(): Promise {\n this.unload = true;\n }\n}\n\nclass CustomLog {\n #adapter: AdapterClassDefinition;\n #prefix: string;\n constructor(adapter: AdapterClassDefinition, text: string = '') {\n this.#adapter = adapter;\n this.#prefix = text;\n }\n getName(): string {\n return this.#prefix;\n }\n debug(log: string, log2: string = ''): void {\n this.#adapter.log.debug(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n info(log: string, log2: string = ''): void {\n this.#adapter.log.info(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n warn(log: string, log2: string = ''): void {\n this.#adapter.log.warn(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n error(log: string, log2: string = ''): void {\n this.#adapter.log.error(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n setLogPrefix(text: string): void {\n this.#prefix = text;\n }\n}\n\nexport class Library extends BaseClass {\n private stateDataBase: { [key: string]: LibraryStateVal } = {};\n private language: ioBroker.Languages | 'uk' = 'en';\n private forbiddenDirs: string[] = [];\n private translation: { [key: string]: string } = {};\n defaults = {\n updateStateOnChangeOnly: true,\n };\n constructor(adapter: AdapterClassDefinition, _options: any = null) {\n super(adapter, 'library');\n this.stateDataBase = {};\n }\n\n async init(): Promise {\n const obj = await this.adapter.getForeignObjectAsync('system.config');\n if (obj) {\n await this.setLanguage(obj.common.language, true);\n } else {\n await this.setLanguage('en', true);\n }\n }\n\n /**\n * Write/create from a Json with defined keys, the associated states and channels\n * @param prefix iobroker datapoint prefix where to write\n * @param objNode Entry point into the definition json.\n * @param def the definition json\n * @param data The Json to read\n * @param expandTree expand arrays up to 99\n * @returns void\n */\n async writeFromJson(\n // provider.dwd.*warncellid*.warnung*1-5*\n prefix: string,\n objNode: string, // the json path to object def for jsonata\n def: statesObjectsType,\n data: any,\n expandTree: boolean = false,\n ): Promise {\n if (!def || typeof def !== 'object') return;\n if (data === undefined || ['string', 'number', 'boolean', 'object'].indexOf(typeof data) == -1) return;\n\n const objectDefinition = objNode ? await this.getObjectDefFromJson(`${objNode}`, def) : null;\n\n if (objectDefinition)\n objectDefinition.native = {\n ...(objectDefinition.native || {}),\n objectDefinitionReference: objNode,\n };\n\n if (typeof data === 'object' && data !== null) {\n // handle array\n if (Array.isArray(data)) {\n if (!objectDefinition) return;\n if (objectDefinition.type !== 'state' || expandTree) {\n let a = 0;\n for (const k in data) {\n const defChannel = this.getChannelObject(objectDefinition);\n\n const dp = `${prefix}${`00${a++}`.slice(-2)}`;\n // create folder\n await this.writedp(dp, null, defChannel);\n\n await this.writeFromJson(dp, `${objNode}`, def, data[k], expandTree);\n }\n } else {\n this.writeFromJson(prefix, objNode, def, JSON.stringify(data) || '[]', expandTree);\n }\n //objectDefinition._id = `${this.adapter.name}.${this.adapter.instance}.${prefix}.${key}`;\n } else {\n // create folder\n if (objectDefinition) {\n const defChannel = this.getChannelObject(objectDefinition);\n await this.writedp(prefix, null, defChannel);\n }\n if (data === null) return;\n\n for (const k in data) {\n await this.writeFromJson(`${prefix}.${k}`, `${objNode}.${k}`, def, data[k], expandTree);\n }\n }\n } else {\n if (!objectDefinition) return;\n await this.writedp(prefix, data, objectDefinition);\n }\n }\n\n /**\n * Get the ioBroker.Object out of stateDefinition\n *\n * @param key is the deep linking key to the definition\n * @param data is the definition dataset\n * @returns ioBroker.ChannelObject | ioBroker.DeviceObject | ioBroker.StateObject\n */\n async getObjectDefFromJson(key: string, data: any): Promise {\n //let result = await jsonata(`${key}`).evaluate(data);\n let result = this.deepJsonValue(key, data);\n if (result === null || result === undefined) {\n const k = key.split('.');\n if (k && k[k.length - 1].startsWith('_')) {\n result = genericStateObjects.customString;\n } else {\n this.log.debug(`No definition for ${key}!`);\n result = genericStateObjects.default;\n }\n }\n return this.cloneObject(result);\n }\n\n deepJsonValue(key: string, data: any): any {\n if (!key || !data || typeof data !== 'object' || typeof key !== 'string') {\n throw new Error(`Error(222) data or key are missing/wrong type!`);\n }\n const k = key.split(`.`);\n let c = 0,\n s = data;\n while (c < k.length) {\n s = s[k[c++]];\n }\n return s;\n }\n\n /**\n * Get a channel/device definition from property _channel out of a getObjectDefFromJson() result or a default definition.\n *\n * @param def the data coming from getObjectDefFromJson()\n * @returns ioBroker.ChannelObject | ioBroker.DeviceObject or a default channel obj\n */\n getChannelObject(\n definition: (ioBroker.Object & { _channel?: ioBroker.Object }) | null = null,\n ): ioBroker.ChannelObject | ioBroker.DeviceObject {\n const def = (definition && definition._channel) || null;\n const result: ioBroker.ChannelObject | ioBroker.DeviceObject = {\n _id: def ? def._id : '',\n type: def && def.type != 'device' ? 'channel' : 'device',\n common: {\n name: (def && def.common && def.common.name) || 'no definition',\n },\n native: (def && def.native) || {},\n };\n return result;\n }\n\n /**\n * Write/Create the specified data point with value, will only be written if val != oldval and obj.type == state or the data point value in the DB is not undefined. Channel and Devices have an undefined value.\n * @param dp Data point to be written. Library.clean() is called with it.\n * @param val Value for this data point. Channel vals (old and new) are undefined so they never will be written.\n * @param obj The object definition for this data point (ioBroker.ChannelObject | ioBroker.DeviceObject | ioBroker.StateObject)\n * @returns void\n */\n async writedp(dp: string, val: ioBroker.StateValue | undefined, obj: ioBroker.Object | null = null): Promise {\n dp = this.cleandp(dp);\n let node = this.readdp(dp);\n const del = !this.isDirAllowed(dp);\n\n if (node === undefined) {\n if (!obj) {\n throw new Error('writedp try to create a state without object informations.');\n }\n obj._id = `${this.adapter.name}.${this.adapter.instance}.${dp}`;\n if (typeof obj.common.name == 'string') obj.common.name = await this.getTranslationObj(obj.common.name);\n if (!del) await this.adapter.extendObjectAsync(dp, obj);\n const stateType = obj && obj.common && obj.common.type;\n node = this.setdb(dp, obj.type, undefined, stateType, true);\n } else if (node.init && obj) {\n if (typeof obj.common.name == 'string') obj.common.name = await this.getTranslationObj(obj.common.name);\n if (!del) await this.adapter.extendObjectAsync(dp, obj);\n }\n\n if (obj && obj.type !== 'state') return;\n\n if (node) this.setdb(dp, node.type, val, node.stateTyp, true);\n\n if (node && (this.defaults.updateStateOnChangeOnly || node.val != val || !node.ack)) {\n const typ = (obj && obj.common && obj.common.type) || node.stateTyp;\n if (typ && typ != typeof val && val !== undefined) val = this.convertToType(val, typ);\n if (!del)\n await this.adapter.setStateAsync(dp, {\n val: val,\n ts: Date.now(),\n ack: true,\n });\n }\n }\n\n setForbiddenDirs(dirs: any[]): void {\n this.forbiddenDirs = this.forbiddenDirs.concat(dirs);\n }\n\n isDirAllowed(dp: string): boolean {\n if (dp && dp.split('.').length <= 2) return true;\n for (const a in this.forbiddenDirs) {\n if (dp.search(new RegExp(this.forbiddenDirs[a], 'g')) != -1) {\n return false;\n }\n }\n return true;\n }\n\n getStates(str: string): { [key: string]: LibraryStateVal } {\n const result: { [key: string]: LibraryStateVal } = {};\n for (const dp in this.stateDataBase) {\n if (dp.search(new RegExp(str, 'g')) != -1) {\n result[dp] = this.stateDataBase[dp];\n }\n }\n return result;\n }\n\n async cleanUpTree(hold: string[], filter: string[] | null, deep: number): Promise {\n let del = [];\n for (const dp in this.stateDataBase) {\n if (filter && filter.filter((a) => dp.startsWith(a) || a.startsWith(dp)).length == 0) continue;\n if (hold.filter((a) => dp.startsWith(a) || a.startsWith(dp)).length > 0) continue;\n delete this.stateDataBase[dp];\n del.push(dp.split('.').slice(0, deep).join('.'));\n }\n del = del.filter((item, pos, arr) => {\n return arr.indexOf(item) == pos;\n });\n for (const a in del) {\n await this.adapter.delObjectAsync(del[a], { recursive: true });\n this.log.debug(`Clean up tree delete: ${del[a]}`);\n }\n }\n\n /**\n * Remove forbidden chars from datapoint string.\n * @param string Datapoint string to clean\n * @param lowerCase lowerCase() first param.\n * @returns void\n */\n cleandp(string: string, lowerCase: boolean = false): string {\n if (!string && typeof string != 'string') return string;\n\n string = string.replace(this.adapter.FORBIDDEN_CHARS, '_');\n // hardliner\n string = string.replace(/[^0-9A-Za-z\\._-]/gu, '_');\n return lowerCase ? string.toLowerCase() : string;\n }\n\n /* Convert a value to the given type\n * @param {string|boolean|number} value \tthen value to convert\n * @param {string} type \t\t\t\t\tthe target type\n * @returns\n */\n convertToType(value: ioBroker.StateValue | Array | JSON, type: string): ioBroker.StateValue {\n if (value === null) return null;\n if (type === undefined) {\n throw new Error('convertToType type undefined not allowed!');\n }\n if (value === undefined) value = '';\n\n const old_type = typeof value;\n let newValue: ioBroker.StateValue = typeof value == 'object' ? JSON.stringify(value) : value;\n\n if (type !== old_type) {\n switch (type) {\n case 'string':\n newValue = value.toString() || '';\n break;\n case 'number':\n newValue = value ? Number(value) : 0;\n break;\n case 'boolean':\n newValue = !!value;\n break;\n case 'array':\n case 'json':\n //JSON.stringify() is done before\n break;\n }\n }\n // get a warning message when we try to convert a object/array.\n return newValue;\n }\n\n readdp(dp: string): LibraryStateVal {\n return this.stateDataBase[this.cleandp(dp)];\n }\n\n setdb(\n dp: string,\n type: ioBroker.ObjectType,\n val: ioBroker.StateValue | undefined,\n stateType: string | undefined,\n ack: boolean = true,\n ts: number = Date.now(),\n init: boolean = false,\n ): LibraryStateVal {\n this.stateDataBase[dp] = {\n type: type,\n stateTyp:\n stateType !== undefined\n ? stateType\n : this.stateDataBase[dp] !== undefined && this.stateDataBase[dp]!.stateTyp !== undefined\n ? this.stateDataBase[dp]!.stateTyp\n : undefined,\n val: val,\n ack: ack,\n ts: ts ? ts : Date.now(),\n init: init,\n };\n return this.stateDataBase[dp];\n }\n\n async memberDeleteAsync(data: any[]): Promise {\n for (const d of data) await d.delete();\n }\n\n cloneObject(obj: ioBroker.Object): ioBroker.Object {\n if (typeof obj !== 'object') {\n this.log.error(`Error clone object target is type: ${typeof obj}`);\n return obj;\n }\n return JSON.parse(JSON.stringify(obj));\n }\n\n cloneGenericObject(obj: object): object {\n if (typeof obj !== 'object') {\n this.log.error(`Error clone object target is type: ${typeof obj}`);\n return obj;\n }\n return JSON.parse(JSON.stringify(obj));\n }\n\n async fileExistAsync(file: string): Promise {\n if (await _fs.existsSync(`./admin/${file}`)) return true;\n return false;\n }\n\n /**\n * Initialise the database with the states to prevent unnecessary creation and writing.\n * @param states States that are to be read into the database during initialisation.\n * @returns void\n */\n async initStates(states: { [key: string]: { val: ioBroker.StateValue; ts: number; ack: boolean } }): Promise {\n if (!states) return;\n const removedChannels: string[] = [];\n for (const state in states) {\n const dp = state.replace(`${this.adapter.name}.${this.adapter.instance}.`, '');\n const del = !this.isDirAllowed(dp);\n if (!del) {\n const obj = await this.adapter.getObjectAsync(dp);\n this.setdb(\n dp,\n 'state',\n states[state] && states[state].val ? states[state].val : undefined,\n obj && obj.common && obj.common.type ? obj.common.type : undefined,\n states[state] && states[state].ack,\n states[state] && states[state].ts ? states[state].ts : Date.now(),\n true,\n );\n } else {\n if (!removedChannels.every((a) => !dp.startsWith(a))) continue;\n const channel = dp.split('.').slice(0, 4).join('.');\n removedChannels.push(channel);\n await this.adapter.delObjectAsync(channel, { recursive: true });\n this.log.debug('Delete channel with dp:' + channel);\n }\n }\n }\n\n /**\n * Resets states that have not been updated in the database in offset time.\n * @param prefix String with which states begin that are reset.\n * @param offset Time in ms since last update.\n * @returns void\n */\n async garbageColleting(prefix: string, offset: number = 2000, del = false): Promise {\n if (!prefix) return;\n if (this.stateDataBase) {\n for (const id in this.stateDataBase) {\n if (id.startsWith(prefix)) {\n const state = this.stateDataBase[id];\n if (!state || state.val == undefined) continue;\n if (state.ts < Date.now() - offset) {\n if (del) {\n await this.cleanUpTree([], [id], -1);\n continue;\n }\n let newVal: -1 | '' | '{}' | '[]' | false | null | undefined;\n switch (state.stateTyp) {\n case 'string':\n if (typeof state.val == 'string') {\n if (state.val.startsWith('{') && state.val.endsWith('}')) newVal = '{}';\n else if (state.val.startsWith('[') && state.val.endsWith(']')) newVal = '[]';\n else newVal = '';\n } else newVal = '';\n break;\n case 'bigint':\n case 'number':\n newVal = -1;\n break;\n\n case 'boolean':\n newVal = false;\n break;\n case 'symbol':\n case 'object':\n case 'function':\n newVal = null;\n break;\n case 'undefined':\n newVal = undefined;\n break;\n }\n await this.writedp(id, newVal);\n }\n }\n }\n }\n }\n\n getLocalLanguage(): string {\n if (this.language) return this.language;\n return 'en-En';\n }\n getTranslation(key: string): string {\n if (this.translation[key] !== undefined) return this.translation[key];\n return key;\n }\n existTranslation(key: string): boolean {\n return this.translation[key] !== undefined;\n }\n\n async getTranslationObj(key: string): Promise {\n const language: (ioBroker.Languages | 'uk')[] = [\n 'en',\n 'de',\n 'ru',\n 'pt',\n 'nl',\n 'fr',\n 'it',\n 'es',\n 'pl',\n 'uk',\n 'zh-cn',\n ];\n const result: { [key: string]: string } = {};\n for (const l of language) {\n try {\n const i = await import(`../../admin/i18n/${l}/translations.json`);\n if (i[key] !== undefined) result[l as string] = i[key];\n } catch (error) {\n return key;\n }\n }\n if (result['en'] == undefined) return key;\n return result as ioBroker.StringOrTranslated;\n }\n\n async setLanguage(language: ioBroker.Languages | 'uk', force = false): Promise {\n if (!language) language = 'en';\n if (force || this.language != language) {\n try {\n this.translation = await import(`../../admin/i18n/${language}/translations.json`);\n this.language = language;\n return true;\n } catch (error) {\n this.log.error(`Language ${language} not exist!`);\n }\n }\n return false;\n }\n sortText(text: string[]): string[] {\n text.sort((a, b) => {\n const nameA = a.toUpperCase(); // ignore upper and lowercase\n const nameB = b.toUpperCase(); // ignore upper and lowercase\n if (nameA < nameB) {\n return -1;\n }\n if (nameA > nameB) {\n return 1;\n }\n\n return 0;\n });\n return text;\n }\n /**\n *\n * @param text string to replace a Date\n * @param noti appendix to translation key\n * @param day true = Mo, 12.05 - false = 12.05\n * @returns Monday first March\n */\n convertSpeakDate(text: string, noti: string = '', day = false): string {\n if (!text || typeof text !== `string`) return ``;\n const b = text.split(`.`);\n if (day) {\n b[0] = b[0].split(' ')[2];\n }\n return (\n ' ' +\n (\n new Date(`${b[1]}/${b[0]}/${new Date().getFullYear()}`).toLocaleString(this.language, {\n weekday: day ? 'long' : undefined,\n day: 'numeric',\n month: `long`,\n }) + ' '\n ).replace(/([0-9]+\\.)/gu, (x) => {\n const result = this.getTranslation(x + noti);\n if (result != x + noti) return result;\n return this.getTranslation(x);\n })\n );\n }\n}\nexport async function sleep(time: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAgB;AAChB,wBAAuD;AADvD;AAsBO,MAAM,UAAU;AAAA,EACnB,SAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAe;AAAA,EACf,YAAY,SAAiC,OAAe,IAAI;AAC5D,SAAK,OAAO;AACZ,SAAK,MAAM,IAAI,UAAU,SAAS,KAAK,IAAI;AAC3C,SAAK,UAAU;AACf,SAAK,UAAU,QAAQ;AAAA,EAC3B;AAAA,EACA,MAAM,SAAwB;AAC1B,SAAK,SAAS;AAAA,EAClB;AACJ;AAEA,MAAM,UAAU;AAAA,EAGZ,YAAY,SAAiC,OAAe,IAAI;AAFhE;AACA;AAEI,uBAAK,UAAW;AAChB,uBAAK,SAAU;AAAA,EACnB;AAAA,EACA,UAAkB;AACd,WAAO,mBAAK;AAAA,EAChB;AAAA,EACA,MAAM,KAAa,OAAe,IAAU;AACxC,uBAAK,UAAS,IAAI,MAAM,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EAClF;AAAA,EACA,KAAK,KAAa,OAAe,IAAU;AACvC,uBAAK,UAAS,IAAI,KAAK,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EACjF;AAAA,EACA,KAAK,KAAa,OAAe,IAAU;AACvC,uBAAK,UAAS,IAAI,KAAK,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EACjF;AAAA,EACA,MAAM,KAAa,OAAe,IAAU;AACxC,uBAAK,UAAS,IAAI,MAAM,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EAClF;AAAA,EACA,aAAa,MAAoB;AAC7B,uBAAK,SAAU;AAAA,EACnB;AACJ;AAxBI;AACA;AAyBG,MAAM,gBAAgB,UAAU;AAAA,EAC3B,gBAAoD,CAAC;AAAA,EACrD,WAAsC;AAAA,EACtC,gBAA0B,CAAC;AAAA,EAC3B,cAAyC,CAAC;AAAA,EAClD,WAAW;AAAA,IACP,yBAAyB;AAAA,EAC7B;AAAA,EACA,YAAY,SAAiC,WAAgB,MAAM;AAC/D,UAAM,SAAS,SAAS;AACxB,SAAK,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAsB;AACxB,UAAM,MAAM,MAAM,KAAK,QAAQ,sBAAsB,eAAe;AACpE,QAAI,KAAK;AACL,YAAM,KAAK,YAAY,IAAI,OAAO,UAAU,IAAI;AAAA,IACpD,OAAO;AACH,YAAM,KAAK,YAAY,MAAM,IAAI;AAAA,IACrC;AAAA,EACJ;AAAA,EAWA,MAAM,cAEF,QACA,SACA,KACA,MACA,aAAsB,OACT;AACb,QAAI,CAAC,OAAO,OAAO,QAAQ;AAAU;AACrC,QAAI,SAAS,UAAa,CAAC,UAAU,UAAU,WAAW,QAAQ,EAAE,QAAQ,OAAO,IAAI,KAAK;AAAI;AAEhG,UAAM,mBAAmB,UAAU,MAAM,KAAK,qBAAqB,GAAG,WAAW,GAAG,IAAI;AAExF,QAAI;AACA,uBAAiB,SAAS;AAAA,QACtB,GAAI,iBAAiB,UAAU,CAAC;AAAA,QAChC,2BAA2B;AAAA,MAC/B;AAEJ,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAE3C,UAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,YAAI,CAAC;AAAkB;AACvB,YAAI,iBAAiB,SAAS,WAAW,YAAY;AACjD,cAAI,IAAI;AACR,qBAAW,KAAK,MAAM;AAClB,kBAAM,aAAa,KAAK,iBAAiB,gBAAgB;AAEzD,kBAAM,KAAK,GAAG,SAAS,KAAK,MAAM,MAAM,EAAE;AAE1C,kBAAM,KAAK,QAAQ,IAAI,MAAM,UAAU;AAEvC,kBAAM,KAAK,cAAc,IAAI,GAAG,WAAW,KAAK,KAAK,IAAI,UAAU;AAAA,UACvE;AAAA,QACJ,OAAO;AACH,eAAK,cAAc,QAAQ,SAAS,KAAK,KAAK,UAAU,IAAI,KAAK,MAAM,UAAU;AAAA,QACrF;AAAA,MAEJ,OAAO;AAEH,YAAI,kBAAkB;AAClB,gBAAM,aAAa,KAAK,iBAAiB,gBAAgB;AACzD,gBAAM,KAAK,QAAQ,QAAQ,MAAM,UAAU;AAAA,QAC/C;AACA,YAAI,SAAS;AAAM;AAEnB,mBAAW,KAAK,MAAM;AAClB,gBAAM,KAAK,cAAc,GAAG,UAAU,KAAK,GAAG,WAAW,KAAK,KAAK,KAAK,IAAI,UAAU;AAAA,QAC1F;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,UAAI,CAAC;AAAkB;AACvB,YAAM,KAAK,QAAQ,QAAQ,MAAM,gBAAgB;AAAA,IACrD;AAAA,EACJ;AAAA,EASA,MAAM,qBAAqB,KAAa,MAAqC;AAEzE,QAAI,SAAS,KAAK,cAAc,KAAK,IAAI;AACzC,QAAI,WAAW,QAAQ,WAAW,QAAW;AACzC,YAAM,IAAI,IAAI,MAAM,GAAG;AACvB,UAAI,KAAK,EAAE,EAAE,SAAS,GAAG,WAAW,GAAG,GAAG;AACtC,iBAAS,sCAAoB;AAAA,MACjC,OAAO;AACH,aAAK,IAAI,MAAM,qBAAqB,MAAM;AAC1C,iBAAS,sCAAoB;AAAA,MACjC;AAAA,IACJ;AACA,WAAO,KAAK,YAAY,MAAM;AAAA,EAClC;AAAA,EAEA,cAAc,KAAa,MAAgB;AACvC,QAAI,CAAC,OAAO,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAO,QAAQ,UAAU;AACtE,YAAM,IAAI,MAAM,gDAAgD;AAAA,IACpE;AACA,UAAM,IAAI,IAAI,MAAM,GAAG;AACvB,QAAI,IAAI,GACJ,IAAI;AACR,WAAO,IAAI,EAAE,QAAQ;AACjB,UAAI,EAAE,EAAE;AAAA,IACZ;AACA,WAAO;AAAA,EACX;AAAA,EAQA,iBACI,aAAwE,MAC1B;AAC9C,UAAM,MAAO,cAAc,WAAW,YAAa;AACnD,UAAM,SAAyD;AAAA,MAC3D,KAAK,MAAM,IAAI,MAAM;AAAA,MACrB,MAAM,OAAO,IAAI,QAAQ,WAAW,YAAY;AAAA,MAChD,QAAQ;AAAA,QACJ,MAAO,OAAO,IAAI,UAAU,IAAI,OAAO,QAAS;AAAA,MACpD;AAAA,MACA,QAAS,OAAO,IAAI,UAAW,CAAC;AAAA,IACpC;AACA,WAAO;AAAA,EACX;AAAA,EASA,MAAM,QAAQ,IAAY,KAAsC,MAA8B,MAAqB;AAC/G,SAAK,KAAK,QAAQ,EAAE;AACpB,QAAI,OAAO,KAAK,OAAO,EAAE;AACzB,UAAM,MAAM,CAAC,KAAK,aAAa,EAAE;AAEjC,QAAI,SAAS,QAAW;AACpB,UAAI,CAAC,KAAK;AACN,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAChF;AACA,UAAI,MAAM,GAAG,KAAK,QAAQ,QAAQ,KAAK,QAAQ,YAAY;AAC3D,UAAI,OAAO,IAAI,OAAO,QAAQ;AAAU,YAAI,OAAO,OAAO,MAAM,KAAK,kBAAkB,IAAI,OAAO,IAAI;AACtG,UAAI,CAAC;AAAK,cAAM,KAAK,QAAQ,kBAAkB,IAAI,GAAG;AACtD,YAAM,YAAY,OAAO,IAAI,UAAU,IAAI,OAAO;AAClD,aAAO,KAAK,MAAM,IAAI,IAAI,MAAM,QAAW,WAAW,IAAI;AAAA,IAC9D,WAAW,KAAK,QAAQ,KAAK;AACzB,UAAI,OAAO,IAAI,OAAO,QAAQ;AAAU,YAAI,OAAO,OAAO,MAAM,KAAK,kBAAkB,IAAI,OAAO,IAAI;AACtG,UAAI,CAAC;AAAK,cAAM,KAAK,QAAQ,kBAAkB,IAAI,GAAG;AAAA,IAC1D;AAEA,QAAI,OAAO,IAAI,SAAS;AAAS;AAEjC,QAAI;AAAM,WAAK,MAAM,IAAI,KAAK,MAAM,KAAK,KAAK,UAAU,IAAI;AAE5D,QAAI,SAAS,KAAK,SAAS,2BAA2B,KAAK,OAAO,OAAO,CAAC,KAAK,MAAM;AACjF,YAAM,MAAO,OAAO,IAAI,UAAU,IAAI,OAAO,QAAS,KAAK;AAC3D,UAAI,OAAO,OAAO,OAAO,OAAO,QAAQ;AAAW,cAAM,KAAK,cAAc,KAAK,GAAG;AACpF,UAAI,CAAC;AACD,cAAM,KAAK,QAAQ,cAAc,IAAI;AAAA,UACjC;AAAA,UACA,IAAI,KAAK,IAAI;AAAA,UACb,KAAK;AAAA,QACT,CAAC;AAAA,IACT;AAAA,EACJ;AAAA,EAEA,iBAAiB,MAAmB;AAChC,SAAK,gBAAgB,KAAK,cAAc,OAAO,IAAI;AAAA,EACvD;AAAA,EAEA,aAAa,IAAqB;AAC9B,QAAI,MAAM,GAAG,MAAM,GAAG,EAAE,UAAU;AAAG,aAAO;AAC5C,eAAW,KAAK,KAAK,eAAe;AAChC,UAAI,GAAG,OAAO,IAAI,OAAO,KAAK,cAAc,IAAI,GAAG,CAAC,KAAK,IAAI;AACzD,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,KAAiD;AACvD,UAAM,SAA6C,CAAC;AACpD,eAAW,MAAM,KAAK,eAAe;AACjC,UAAI,GAAG,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,IAAI;AACvC,eAAO,MAAM,KAAK,cAAc;AAAA,MACpC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,YAAY,MAAgB,QAAyB,MAA6B;AACpF,QAAI,MAAM,CAAC;AACX,eAAW,MAAM,KAAK,eAAe;AACjC,UAAI,UAAU,OAAO,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU;AAAG;AACtF,UAAI,KAAK,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS;AAAG;AACzE,aAAO,KAAK,cAAc;AAC1B,UAAI,KAAK,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,IACnD;AACA,UAAM,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;AACjC,aAAO,IAAI,QAAQ,IAAI,KAAK;AAAA,IAChC,CAAC;AACD,eAAW,KAAK,KAAK;AACjB,YAAM,KAAK,QAAQ,eAAe,IAAI,IAAI,EAAE,WAAW,KAAK,CAAC;AAC7D,WAAK,IAAI,MAAM,yBAAyB,IAAI,IAAI;AAAA,IACpD;AAAA,EACJ;AAAA,EAQA,QAAQ,QAAgB,YAAqB,OAAe;AACxD,QAAI,CAAC,UAAU,OAAO,UAAU;AAAU,aAAO;AAEjD,aAAS,OAAO,QAAQ,KAAK,QAAQ,iBAAiB,GAAG;AAEzD,aAAS,OAAO,QAAQ,sBAAsB,GAAG;AACjD,WAAO,YAAY,OAAO,YAAY,IAAI;AAAA,EAC9C;AAAA,EAOA,cAAc,OAAgD,MAAmC;AAC7F,QAAI,UAAU;AAAM,aAAO;AAC3B,QAAI,SAAS,QAAW;AACpB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC/D;AACA,QAAI,UAAU;AAAW,cAAQ;AAEjC,UAAM,WAAW,OAAO;AACxB,QAAI,WAAgC,OAAO,SAAS,WAAW,KAAK,UAAU,KAAK,IAAI;AAEvF,QAAI,SAAS,UAAU;AACnB,cAAQ,MAAM;AAAA,QACV,KAAK;AACD,qBAAW,MAAM,SAAS,KAAK;AAC/B;AAAA,QACJ,KAAK;AACD,qBAAW,QAAQ,OAAO,KAAK,IAAI;AACnC;AAAA,QACJ,KAAK;AACD,qBAAW,CAAC,CAAC;AACb;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAED;AAAA,MACR;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,IAA6B;AAChC,WAAO,KAAK,cAAc,KAAK,QAAQ,EAAE;AAAA,EAC7C;AAAA,EAEA,MACI,IACA,MACA,KACA,WACA,MAAe,MACf,KAAa,KAAK,IAAI,GACtB,OAAgB,OACD;AACf,SAAK,cAAc,MAAM;AAAA,MACrB;AAAA,MACA,UACI,cAAc,SACR,YACA,KAAK,cAAc,QAAQ,UAAa,KAAK,cAAc,IAAK,aAAa,SAC3E,KAAK,cAAc,IAAK,WACxB;AAAA,MACZ;AAAA,MACA;AAAA,MACA,IAAI,KAAK,KAAK,KAAK,IAAI;AAAA,MACvB;AAAA,IACJ;AACA,WAAO,KAAK,cAAc;AAAA,EAC9B;AAAA,EAEA,MAAM,kBAAkB,MAA4B;AAChD,eAAW,KAAK;AAAM,YAAM,EAAE,OAAO;AAAA,EACzC;AAAA,EAEA,YAAY,KAAuC;AAC/C,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,IAAI,MAAM,sCAAsC,OAAO,KAAK;AACjE,aAAO;AAAA,IACX;AACA,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACzC;AAAA,EAEA,mBAAmB,KAAqB;AACpC,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,IAAI,MAAM,sCAAsC,OAAO,KAAK;AACjE,aAAO;AAAA,IACX;AACA,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,eAAe,MAAgC;AACjD,QAAI,MAAM,UAAAA,QAAI,WAAW,WAAW,MAAM;AAAG,aAAO;AACpD,WAAO;AAAA,EACX;AAAA,EAOA,MAAM,WAAW,QAAkG;AAC/G,QAAI,CAAC;AAAQ;AACb,UAAM,kBAA4B,CAAC;AACnC,eAAW,SAAS,QAAQ;AACxB,YAAM,KAAK,MAAM,QAAQ,GAAG,KAAK,QAAQ,QAAQ,KAAK,QAAQ,aAAa,EAAE;AAC7E,YAAM,MAAM,CAAC,KAAK,aAAa,EAAE;AACjC,UAAI,CAAC,KAAK;AACN,cAAM,MAAM,MAAM,KAAK,QAAQ,eAAe,EAAE;AAChD,aAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA,OAAO,UAAU,OAAO,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,UACzD,OAAO,IAAI,UAAU,IAAI,OAAO,OAAO,IAAI,OAAO,OAAO;AAAA,UACzD,OAAO,UAAU,OAAO,OAAO;AAAA,UAC/B,OAAO,UAAU,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI;AAAA,UAChE;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,YAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC;AAAG;AACtD,cAAM,UAAU,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAClD,wBAAgB,KAAK,OAAO;AAC5B,cAAM,KAAK,QAAQ,eAAe,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9D,aAAK,IAAI,MAAM,4BAA4B,OAAO;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ;AAAA,EAQA,MAAM,iBAAiB,QAAgB,SAAiB,KAAM,MAAM,OAAsB;AACtF,QAAI,CAAC;AAAQ;AACb,QAAI,KAAK,eAAe;AACpB,iBAAW,MAAM,KAAK,eAAe;AACjC,YAAI,GAAG,WAAW,MAAM,GAAG;AACvB,gBAAM,QAAQ,KAAK,cAAc;AACjC,cAAI,CAAC,SAAS,MAAM,OAAO;AAAW;AACtC,cAAI,MAAM,KAAK,KAAK,IAAI,IAAI,QAAQ;AAChC,gBAAI,KAAK;AACL,oBAAM,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;AACnC;AAAA,YACJ;AACA,gBAAI;AACJ,oBAAQ,MAAM,UAAU;AAAA,cACpB,KAAK;AACD,oBAAI,OAAO,MAAM,OAAO,UAAU;AAC9B,sBAAI,MAAM,IAAI,WAAW,GAAG,KAAK,MAAM,IAAI,SAAS,GAAG;AAAG,6BAAS;AAAA,2BAC1D,MAAM,IAAI,WAAW,GAAG,KAAK,MAAM,IAAI,SAAS,GAAG;AAAG,6BAAS;AAAA;AACnE,6BAAS;AAAA,gBAClB;AAAO,2BAAS;AAChB;AAAA,cACJ,KAAK;AAAA,cACL,KAAK;AACD,yBAAS;AACT;AAAA,cAEJ,KAAK;AACD,yBAAS;AACT;AAAA,cACJ,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AACD,yBAAS;AACT;AAAA,cACJ,KAAK;AACD,yBAAS;AACT;AAAA,YACR;AACA,kBAAM,KAAK,QAAQ,IAAI,MAAM;AAAA,UACjC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,mBAA2B;AACvB,QAAI,KAAK;AAAU,aAAO,KAAK;AAC/B,WAAO;AAAA,EACX;AAAA,EACA,eAAe,KAAqB;AAChC,QAAI,KAAK,YAAY,SAAS;AAAW,aAAO,KAAK,YAAY;AACjE,WAAO;AAAA,EACX;AAAA,EACA,iBAAiB,KAAsB;AACnC,WAAO,KAAK,YAAY,SAAS;AAAA,EACrC;AAAA,EAEA,MAAM,kBAAkB,KAAmD;AACvE,UAAM,WAA0C;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,UAAM,SAAoC,CAAC;AAC3C,eAAW,KAAK,UAAU;AACtB,UAAI;AACA,cAAM,IAAI,MAAM,6BAAO,QAAP,QAAO,oBAAoB;AAC3C,YAAI,EAAE,SAAS;AAAW,iBAAO,KAAe,EAAE;AAAA,MACtD,SAAS,OAAP;AACE,eAAO;AAAA,MACX;AAAA,IACJ;AACA,QAAI,OAAO,SAAS;AAAW,aAAO;AACtC,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,YAAY,UAAqC,QAAQ,OAAyB;AACpF,QAAI,CAAC;AAAU,iBAAW;AAC1B,QAAI,SAAS,KAAK,YAAY,UAAU;AACpC,UAAI;AACA,aAAK,cAAc,MAAM,6BAAO,QAAP,QAAO,oBAAoB;AACpD,aAAK,WAAW;AAChB,eAAO;AAAA,MACX,SAAS,OAAP;AACE,aAAK,IAAI,MAAM,YAAY,qBAAqB;AAAA,MACpD;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,SAAS,MAA0B;AAC/B,SAAK,KAAK,CAAC,GAAG,MAAM;AAChB,YAAM,QAAQ,EAAE,YAAY;AAC5B,YAAM,QAAQ,EAAE,YAAY;AAC5B,UAAI,QAAQ,OAAO;AACf,eAAO;AAAA,MACX;AACA,UAAI,QAAQ,OAAO;AACf,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAQA,iBAAiB,MAAc,OAAe,IAAI,MAAM,OAAe;AACnE,QAAI,CAAC,QAAQ,OAAO,SAAS;AAAU,aAAO;AAC9C,UAAM,IAAI,KAAK,MAAM,GAAG;AACxB,QAAI,KAAK;AACL,QAAE,KAAK,EAAE,GAAG,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WACI,OAEI,IAAI,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,eAAe,KAAK,UAAU;AAAA,MAClF,SAAS,MAAM,SAAS;AAAA,MACxB,KAAK;AAAA,MACL,OAAO;AAAA,IACX,CAAC,IAAI,KACP,QAAQ,gBAAgB,CAAC,MAAM;AAC7B,YAAM,SAAS,KAAK,eAAe,IAAI,IAAI;AAC3C,UAAI,UAAU,IAAI;AAAM,eAAO;AAC/B,aAAO,KAAK,eAAe,CAAC;AAAA,IAChC,CAAC;AAAA,EAET;AACJ;AACA,eAAsB,MAAM,MAA6B;AACrD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,IAAI,CAAC;AAC7D;", + "sourcesContent": ["import _fs from 'fs';\nimport { genericStateObjects, statesObjectsType } from './definition';\nimport { Espresense } from '../main';\n\n// only change this for other adapters\nexport type AdapterClassDefinition = Espresense;\n\ntype LibraryStateVal = LibraryStateValJson | undefined;\ntype LibraryStateValJson = {\n type: ioBroker.ObjectType;\n stateTyp: string | undefined;\n val: ioBroker.StateValue | undefined;\n ts: number;\n ack: boolean;\n obj: ioBroker.Object | undefined;\n init: boolean;\n};\n\n// Generic library module and base classes, do not insert specific adapter code here.\n\n/**\n * Base class with this.log function\n */\nexport class BaseClass {\n unload: boolean = false;\n log: CustomLog;\n adapter: AdapterClassDefinition;\n library: Library;\n name: string = ``;\n constructor(adapter: AdapterClassDefinition, name: string = '') {\n this.name = name;\n this.log = new CustomLog(adapter, this.name);\n this.adapter = adapter;\n this.library = adapter.library;\n }\n async delete(): Promise {\n this.unload = true;\n }\n}\n\nclass CustomLog {\n #adapter: AdapterClassDefinition;\n #prefix: string;\n constructor(adapter: AdapterClassDefinition, text: string = '') {\n this.#adapter = adapter;\n this.#prefix = text;\n }\n getName(): string {\n return this.#prefix;\n }\n debug(log: string, log2: string = ''): void {\n this.#adapter.log.debug(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n info(log: string, log2: string = ''): void {\n this.#adapter.log.info(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n warn(log: string, log2: string = ''): void {\n this.#adapter.log.warn(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n error(log: string, log2: string = ''): void {\n this.#adapter.log.error(log2 ? `[${log}] ${log2}` : `[${this.#prefix}] ${log}`);\n }\n setLogPrefix(text: string): void {\n this.#prefix = text;\n }\n}\n\nexport class Library extends BaseClass {\n private stateDataBase: { [key: string]: LibraryStateVal } = {};\n private language: ioBroker.Languages | 'uk' = 'en';\n private forbiddenDirs: string[] = [];\n private translation: { [key: string]: string } = {};\n defaults = {\n updateStateOnChangeOnly: true,\n };\n constructor(adapter: AdapterClassDefinition, _options: any = null) {\n super(adapter, 'library');\n this.stateDataBase = {};\n }\n\n async init(): Promise {\n const obj = await this.adapter.getForeignObjectAsync('system.config');\n if (obj) {\n await this.setLanguage(obj.common.language, true);\n } else {\n await this.setLanguage('en', true);\n }\n }\n\n /**\n * Write/create from a Json with defined keys, the associated states and channels\n * @param prefix iobroker datapoint prefix where to write\n * @param objNode Entry point into the definition json.\n * @param def the definition json\n * @param data The Json to read\n * @param expandTree expand arrays up to 99\n * @returns void\n */\n async writeFromJson(\n // provider.dwd.*warncellid*.warnung*1-5*\n prefix: string,\n objNode: string, // the json path to object def for jsonata\n def: statesObjectsType,\n data: any,\n expandTree: boolean = false,\n ): Promise {\n if (!def || typeof def !== 'object') return;\n if (data === undefined || ['string', 'number', 'boolean', 'object'].indexOf(typeof data) == -1) return;\n\n const objectDefinition = objNode ? await this.getObjectDefFromJson(`${objNode}`, def) : null;\n\n if (objectDefinition)\n objectDefinition.native = {\n ...(objectDefinition.native || {}),\n objectDefinitionReference: objNode,\n };\n\n if (typeof data === 'object' && data !== null) {\n // handle array\n if (Array.isArray(data)) {\n if (!objectDefinition) return;\n if (objectDefinition.type !== 'state' || expandTree) {\n let a = 0;\n for (const k in data) {\n const defChannel = this.getChannelObject(objectDefinition);\n\n const dp = `${prefix}${`00${a++}`.slice(-2)}`;\n // create folder\n await this.writedp(dp, null, defChannel);\n\n await this.writeFromJson(dp, `${objNode}`, def, data[k], expandTree);\n }\n } else {\n this.writeFromJson(prefix, objNode, def, JSON.stringify(data) || '[]', expandTree);\n }\n //objectDefinition._id = `${this.adapter.name}.${this.adapter.instance}.${prefix}.${key}`;\n } else {\n // create folder\n if (objectDefinition) {\n const defChannel = this.getChannelObject(objectDefinition);\n await this.writedp(prefix, null, defChannel);\n }\n if (data === null) return;\n\n for (const k in data) {\n await this.writeFromJson(`${prefix}.${k}`, `${objNode}.${k}`, def, data[k], expandTree);\n }\n }\n } else {\n if (!objectDefinition) return;\n await this.writedp(prefix, data, objectDefinition);\n }\n }\n\n /**\n * Get the ioBroker.Object out of stateDefinition\n *\n * @param key is the deep linking key to the definition\n * @param data is the definition dataset\n * @returns ioBroker.ChannelObject | ioBroker.DeviceObject | ioBroker.StateObject\n */\n async getObjectDefFromJson(key: string, data: any): Promise {\n //let result = await jsonata(`${key}`).evaluate(data);\n let result = this.deepJsonValue(key, data);\n if (result === null || result === undefined) {\n const k = key.split('.');\n if (k && k[k.length - 1].startsWith('_')) {\n result = genericStateObjects.customString;\n } else {\n this.log.debug(`No definition for ${key}!`);\n result = genericStateObjects.default;\n }\n }\n return this.cloneObject(result);\n }\n\n deepJsonValue(key: string, data: any): any {\n if (!key || !data || typeof data !== 'object' || typeof key !== 'string') {\n throw new Error(`Error(222) data or key are missing/wrong type!`);\n }\n const k = key.split(`.`);\n let c = 0,\n s = data;\n while (c < k.length) {\n s = s[k[c++]];\n }\n return s;\n }\n\n /**\n * Get a channel/device definition from property _channel out of a getObjectDefFromJson() result or a default definition.\n *\n * @param def the data coming from getObjectDefFromJson()\n * @returns ioBroker.ChannelObject | ioBroker.DeviceObject or a default channel obj\n */\n getChannelObject(\n definition: (ioBroker.Object & { _channel?: ioBroker.Object }) | null = null,\n ): ioBroker.ChannelObject | ioBroker.DeviceObject {\n const def = (definition && definition._channel) || null;\n const result: ioBroker.ChannelObject | ioBroker.DeviceObject = {\n _id: def ? def._id : '',\n type: def && def.type != 'device' ? 'channel' : 'device',\n common: {\n name: (def && def.common && def.common.name) || 'no definition',\n },\n native: (def && def.native) || {},\n };\n return result;\n }\n\n /**\n * Write/Create the specified data point with value, will only be written if val != oldval and obj.type == state or the data point value in the DB is not undefined. Channel and Devices have an undefined value.\n * @param dp Data point to be written. Library.clean() is called with it.\n * @param val Value for this data point. Channel vals (old and new) are undefined so they never will be written.\n * @param obj The object definition for this data point (ioBroker.ChannelObject | ioBroker.DeviceObject | ioBroker.StateObject)\n * @returns void\n */\n async writedp(dp: string, val: ioBroker.StateValue | undefined, obj: ioBroker.Object | null = null): Promise {\n dp = this.cleandp(dp);\n let node = this.readdp(dp);\n const del = !this.isDirAllowed(dp);\n\n if (node === undefined) {\n if (!obj) {\n throw new Error('writedp try to create a state without object informations.');\n }\n obj._id = `${this.adapter.name}.${this.adapter.instance}.${dp}`;\n if (typeof obj.common.name == 'string') obj.common.name = await this.getTranslationObj(obj.common.name);\n if (!del) await this.adapter.extendObjectAsync(dp, obj);\n const stateType = obj && obj.common && obj.common.type;\n node = this.setdb(dp, obj.type, undefined, stateType, true, Date.now(), obj);\n } else if (node.init && obj) {\n if (typeof obj.common.name == 'string') obj.common.name = await this.getTranslationObj(obj.common.name);\n if (!del) await this.adapter.extendObjectAsync(dp, obj);\n }\n\n if (obj && obj.type !== 'state') return;\n\n if (node) this.setdb(dp, node.type, val, node.stateTyp, true);\n\n if (node && (this.defaults.updateStateOnChangeOnly || node.val != val || !node.ack)) {\n const typ = (obj && obj.common && obj.common.type) || node.stateTyp;\n if (typ && typ != typeof val && val !== undefined) val = this.convertToType(val, typ);\n if (!del)\n await this.adapter.setStateAsync(dp, {\n val: val,\n ts: Date.now(),\n ack: true,\n });\n }\n }\n\n setForbiddenDirs(dirs: any[]): void {\n this.forbiddenDirs = this.forbiddenDirs.concat(dirs);\n }\n\n isDirAllowed(dp: string): boolean {\n if (dp && dp.split('.').length <= 2) return true;\n for (const a in this.forbiddenDirs) {\n if (dp.search(new RegExp(this.forbiddenDirs[a], 'g')) != -1) {\n return false;\n }\n }\n return true;\n }\n\n getStates(str: string): { [key: string]: LibraryStateVal } {\n const result: { [key: string]: LibraryStateVal } = {};\n for (const dp in this.stateDataBase) {\n if (dp.search(new RegExp(str, 'g')) != -1) {\n result[dp] = this.stateDataBase[dp];\n }\n }\n return result;\n }\n\n async cleanUpTree(hold: string[], filter: string[] | null, deep: number): Promise {\n let del = [];\n for (const dp in this.stateDataBase) {\n if (filter && filter.filter((a) => dp.startsWith(a) || a.startsWith(dp)).length == 0) continue;\n if (hold.filter((a) => dp.startsWith(a) || a.startsWith(dp)).length > 0) continue;\n delete this.stateDataBase[dp];\n del.push(dp.split('.').slice(0, deep).join('.'));\n }\n del = del.filter((item, pos, arr) => {\n return arr.indexOf(item) == pos;\n });\n for (const a in del) {\n await this.adapter.delObjectAsync(del[a], { recursive: true });\n this.log.debug(`Clean up tree delete: ${del[a]}`);\n }\n }\n\n /**\n * Remove forbidden chars from datapoint string.\n * @param string Datapoint string to clean\n * @param lowerCase lowerCase() first param.\n * @returns void\n */\n cleandp(string: string, lowerCase: boolean = false): string {\n if (!string && typeof string != 'string') return string;\n\n string = string.replace(this.adapter.FORBIDDEN_CHARS, '_');\n // hardliner\n string = string.replace(/[^0-9A-Za-z\\._-]/gu, '_');\n return lowerCase ? string.toLowerCase() : string;\n }\n\n /* Convert a value to the given type\n * @param {string|boolean|number} value \tthen value to convert\n * @param {string} type \t\t\t\t\tthe target type\n * @returns\n */\n convertToType(value: ioBroker.StateValue | Array | JSON, type: string): ioBroker.StateValue {\n if (value === null) return null;\n if (type === undefined) {\n throw new Error('convertToType type undefined not allowed!');\n }\n if (value === undefined) value = '';\n\n const old_type = typeof value;\n let newValue: ioBroker.StateValue = typeof value == 'object' ? JSON.stringify(value) : value;\n\n if (type !== old_type) {\n switch (type) {\n case 'string':\n newValue = value.toString() || '';\n break;\n case 'number':\n newValue = value ? Number(value) : 0;\n break;\n case 'boolean':\n newValue = !!value;\n break;\n case 'array':\n case 'json':\n //JSON.stringify() is done before\n break;\n }\n }\n // get a warning message when we try to convert a object/array.\n return newValue;\n }\n\n readdp(dp: string): LibraryStateVal {\n return this.stateDataBase[this.cleandp(dp)];\n }\n\n setdb(\n dp: string,\n type: ioBroker.ObjectType,\n val: ioBroker.StateValue | undefined,\n stateType: string | undefined,\n ack: boolean = true,\n ts: number = Date.now(),\n obj: ioBroker.Object | undefined = undefined,\n init: boolean = false,\n ): LibraryStateVal {\n this.stateDataBase[dp] = {\n type: type,\n stateTyp:\n stateType !== undefined\n ? stateType\n : this.stateDataBase[dp] !== undefined && this.stateDataBase[dp]!.stateTyp !== undefined\n ? this.stateDataBase[dp]!.stateTyp\n : undefined,\n val: val,\n ack: ack,\n ts: ts ? ts : Date.now(),\n obj:\n obj !== undefined\n ? obj\n : this.stateDataBase[dp] !== undefined && this.stateDataBase[dp]!.obj !== undefined\n ? this.stateDataBase[dp]!.obj\n : undefined,\n init: init,\n };\n return this.stateDataBase[dp];\n }\n\n async memberDeleteAsync(data: any[]): Promise {\n for (const d of data) await d.delete();\n }\n\n cloneObject(obj: ioBroker.Object): ioBroker.Object {\n if (typeof obj !== 'object') {\n this.log.error(`Error clone object target is type: ${typeof obj}`);\n return obj;\n }\n return JSON.parse(JSON.stringify(obj));\n }\n\n cloneGenericObject(obj: object): object {\n if (typeof obj !== 'object') {\n this.log.error(`Error clone object target is type: ${typeof obj}`);\n return obj;\n }\n return JSON.parse(JSON.stringify(obj));\n }\n\n async fileExistAsync(file: string): Promise {\n if (await _fs.existsSync(`./admin/${file}`)) return true;\n return false;\n }\n\n /**\n * Initialise the database with the states to prevent unnecessary creation and writing.\n * @param states States that are to be read into the database during initialisation.\n * @returns void\n */\n async initStates(states: { [key: string]: { val: ioBroker.StateValue; ts: number; ack: boolean } }): Promise {\n if (!states) return;\n const removedChannels: string[] = [];\n for (const state in states) {\n const dp = state.replace(`${this.adapter.name}.${this.adapter.instance}.`, '');\n const del = !this.isDirAllowed(dp);\n if (!del) {\n const obj = await this.adapter.getObjectAsync(dp);\n this.setdb(\n dp,\n 'state',\n states[state] && states[state].val ? states[state].val : undefined,\n obj && obj.common && obj.common.type ? obj.common.type : undefined,\n states[state] && states[state].ack,\n states[state] && states[state].ts ? states[state].ts : Date.now(),\n obj == null ? undefined : obj,\n true,\n );\n } else {\n if (!removedChannels.every((a) => !dp.startsWith(a))) continue;\n const channel = dp.split('.').slice(0, 4).join('.');\n removedChannels.push(channel);\n await this.adapter.delObjectAsync(channel, { recursive: true });\n this.log.debug('Delete channel with dp:' + channel);\n }\n }\n }\n\n /**\n * Resets states that have not been updated in the database in offset time.\n * @param prefix String with which states begin that are reset.\n * @param offset Time in ms since last update.\n * @returns void\n */\n async garbageColleting(prefix: string, offset: number = 2000, del = false): Promise {\n if (!prefix) return;\n if (this.stateDataBase) {\n for (const id in this.stateDataBase) {\n if (id.startsWith(prefix)) {\n const state = this.stateDataBase[id];\n if (!state || state.val == undefined) continue;\n if (state.ts < Date.now() - offset) {\n if (del) {\n await this.cleanUpTree([], [id], -1);\n continue;\n }\n let newVal: -1 | '' | '{}' | '[]' | false | null | undefined;\n switch (state.stateTyp) {\n case 'string':\n if (typeof state.val == 'string') {\n if (state.val.startsWith('{') && state.val.endsWith('}')) newVal = '{}';\n else if (state.val.startsWith('[') && state.val.endsWith(']')) newVal = '[]';\n else newVal = '';\n } else newVal = '';\n break;\n case 'bigint':\n case 'number':\n newVal = -1;\n break;\n\n case 'boolean':\n newVal = false;\n break;\n case 'symbol':\n case 'object':\n case 'function':\n newVal = null;\n break;\n case 'undefined':\n newVal = undefined;\n break;\n }\n await this.writedp(id, newVal);\n }\n }\n }\n }\n }\n\n getLocalLanguage(): string {\n if (this.language) return this.language;\n return 'en-En';\n }\n getTranslation(key: string): string {\n if (this.translation[key] !== undefined) return this.translation[key];\n return key;\n }\n existTranslation(key: string): boolean {\n return this.translation[key] !== undefined;\n }\n\n async getTranslationObj(key: string): Promise {\n const language: (ioBroker.Languages | 'uk')[] = [\n 'en',\n 'de',\n 'ru',\n 'pt',\n 'nl',\n 'fr',\n 'it',\n 'es',\n 'pl',\n 'uk',\n 'zh-cn',\n ];\n const result: { [key: string]: string } = {};\n for (const l of language) {\n try {\n const i = await import(`../../admin/i18n/${l}/translations.json`);\n if (i[key] !== undefined) result[l as string] = i[key];\n } catch (error) {\n return key;\n }\n }\n if (result['en'] == undefined) return key;\n return result as ioBroker.StringOrTranslated;\n }\n\n async setLanguage(language: ioBroker.Languages | 'uk', force = false): Promise {\n if (!language) language = 'en';\n if (force || this.language != language) {\n try {\n this.translation = await import(`../../admin/i18n/${language}/translations.json`);\n this.language = language;\n return true;\n } catch (error) {\n this.log.error(`Language ${language} not exist!`);\n }\n }\n return false;\n }\n sortText(text: string[]): string[] {\n text.sort((a, b) => {\n const nameA = a.toUpperCase(); // ignore upper and lowercase\n const nameB = b.toUpperCase(); // ignore upper and lowercase\n if (nameA < nameB) {\n return -1;\n }\n if (nameA > nameB) {\n return 1;\n }\n\n return 0;\n });\n return text;\n }\n /**\n *\n * @param text string to replace a Date\n * @param noti appendix to translation key\n * @param day true = Mo, 12.05 - false = 12.05\n * @returns Monday first March\n */\n convertSpeakDate(text: string, noti: string = '', day = false): string {\n if (!text || typeof text !== `string`) return ``;\n const b = text.split(`.`);\n if (day) {\n b[0] = b[0].split(' ')[2];\n }\n return (\n ' ' +\n (\n new Date(`${b[1]}/${b[0]}/${new Date().getFullYear()}`).toLocaleString(this.language, {\n weekday: day ? 'long' : undefined,\n day: 'numeric',\n month: `long`,\n }) + ' '\n ).replace(/([0-9]+\\.)/gu, (x) => {\n const result = this.getTranslation(x + noti);\n if (result != x + noti) return result;\n return this.getTranslation(x);\n })\n );\n }\n}\nexport async function sleep(time: number): Promise {\n return new Promise((resolve) => setTimeout(resolve, time));\n}\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAgB;AAChB,wBAAuD;AADvD;AAuBO,MAAM,UAAU;AAAA,EACnB,SAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAe;AAAA,EACf,YAAY,SAAiC,OAAe,IAAI;AAC5D,SAAK,OAAO;AACZ,SAAK,MAAM,IAAI,UAAU,SAAS,KAAK,IAAI;AAC3C,SAAK,UAAU;AACf,SAAK,UAAU,QAAQ;AAAA,EAC3B;AAAA,EACA,MAAM,SAAwB;AAC1B,SAAK,SAAS;AAAA,EAClB;AACJ;AAEA,MAAM,UAAU;AAAA,EAGZ,YAAY,SAAiC,OAAe,IAAI;AAFhE;AACA;AAEI,uBAAK,UAAW;AAChB,uBAAK,SAAU;AAAA,EACnB;AAAA,EACA,UAAkB;AACd,WAAO,mBAAK;AAAA,EAChB;AAAA,EACA,MAAM,KAAa,OAAe,IAAU;AACxC,uBAAK,UAAS,IAAI,MAAM,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EAClF;AAAA,EACA,KAAK,KAAa,OAAe,IAAU;AACvC,uBAAK,UAAS,IAAI,KAAK,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EACjF;AAAA,EACA,KAAK,KAAa,OAAe,IAAU;AACvC,uBAAK,UAAS,IAAI,KAAK,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EACjF;AAAA,EACA,MAAM,KAAa,OAAe,IAAU;AACxC,uBAAK,UAAS,IAAI,MAAM,OAAO,IAAI,QAAQ,SAAS,IAAI,mBAAK,aAAY,KAAK;AAAA,EAClF;AAAA,EACA,aAAa,MAAoB;AAC7B,uBAAK,SAAU;AAAA,EACnB;AACJ;AAxBI;AACA;AAyBG,MAAM,gBAAgB,UAAU;AAAA,EAC3B,gBAAoD,CAAC;AAAA,EACrD,WAAsC;AAAA,EACtC,gBAA0B,CAAC;AAAA,EAC3B,cAAyC,CAAC;AAAA,EAClD,WAAW;AAAA,IACP,yBAAyB;AAAA,EAC7B;AAAA,EACA,YAAY,SAAiC,WAAgB,MAAM;AAC/D,UAAM,SAAS,SAAS;AACxB,SAAK,gBAAgB,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAsB;AACxB,UAAM,MAAM,MAAM,KAAK,QAAQ,sBAAsB,eAAe;AACpE,QAAI,KAAK;AACL,YAAM,KAAK,YAAY,IAAI,OAAO,UAAU,IAAI;AAAA,IACpD,OAAO;AACH,YAAM,KAAK,YAAY,MAAM,IAAI;AAAA,IACrC;AAAA,EACJ;AAAA,EAWA,MAAM,cAEF,QACA,SACA,KACA,MACA,aAAsB,OACT;AACb,QAAI,CAAC,OAAO,OAAO,QAAQ;AAAU;AACrC,QAAI,SAAS,UAAa,CAAC,UAAU,UAAU,WAAW,QAAQ,EAAE,QAAQ,OAAO,IAAI,KAAK;AAAI;AAEhG,UAAM,mBAAmB,UAAU,MAAM,KAAK,qBAAqB,GAAG,WAAW,GAAG,IAAI;AAExF,QAAI;AACA,uBAAiB,SAAS;AAAA,QACtB,GAAI,iBAAiB,UAAU,CAAC;AAAA,QAChC,2BAA2B;AAAA,MAC/B;AAEJ,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAE3C,UAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,YAAI,CAAC;AAAkB;AACvB,YAAI,iBAAiB,SAAS,WAAW,YAAY;AACjD,cAAI,IAAI;AACR,qBAAW,KAAK,MAAM;AAClB,kBAAM,aAAa,KAAK,iBAAiB,gBAAgB;AAEzD,kBAAM,KAAK,GAAG,SAAS,KAAK,MAAM,MAAM,EAAE;AAE1C,kBAAM,KAAK,QAAQ,IAAI,MAAM,UAAU;AAEvC,kBAAM,KAAK,cAAc,IAAI,GAAG,WAAW,KAAK,KAAK,IAAI,UAAU;AAAA,UACvE;AAAA,QACJ,OAAO;AACH,eAAK,cAAc,QAAQ,SAAS,KAAK,KAAK,UAAU,IAAI,KAAK,MAAM,UAAU;AAAA,QACrF;AAAA,MAEJ,OAAO;AAEH,YAAI,kBAAkB;AAClB,gBAAM,aAAa,KAAK,iBAAiB,gBAAgB;AACzD,gBAAM,KAAK,QAAQ,QAAQ,MAAM,UAAU;AAAA,QAC/C;AACA,YAAI,SAAS;AAAM;AAEnB,mBAAW,KAAK,MAAM;AAClB,gBAAM,KAAK,cAAc,GAAG,UAAU,KAAK,GAAG,WAAW,KAAK,KAAK,KAAK,IAAI,UAAU;AAAA,QAC1F;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,UAAI,CAAC;AAAkB;AACvB,YAAM,KAAK,QAAQ,QAAQ,MAAM,gBAAgB;AAAA,IACrD;AAAA,EACJ;AAAA,EASA,MAAM,qBAAqB,KAAa,MAAqC;AAEzE,QAAI,SAAS,KAAK,cAAc,KAAK,IAAI;AACzC,QAAI,WAAW,QAAQ,WAAW,QAAW;AACzC,YAAM,IAAI,IAAI,MAAM,GAAG;AACvB,UAAI,KAAK,EAAE,EAAE,SAAS,GAAG,WAAW,GAAG,GAAG;AACtC,iBAAS,sCAAoB;AAAA,MACjC,OAAO;AACH,aAAK,IAAI,MAAM,qBAAqB,MAAM;AAC1C,iBAAS,sCAAoB;AAAA,MACjC;AAAA,IACJ;AACA,WAAO,KAAK,YAAY,MAAM;AAAA,EAClC;AAAA,EAEA,cAAc,KAAa,MAAgB;AACvC,QAAI,CAAC,OAAO,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAO,QAAQ,UAAU;AACtE,YAAM,IAAI,MAAM,gDAAgD;AAAA,IACpE;AACA,UAAM,IAAI,IAAI,MAAM,GAAG;AACvB,QAAI,IAAI,GACJ,IAAI;AACR,WAAO,IAAI,EAAE,QAAQ;AACjB,UAAI,EAAE,EAAE;AAAA,IACZ;AACA,WAAO;AAAA,EACX;AAAA,EAQA,iBACI,aAAwE,MAC1B;AAC9C,UAAM,MAAO,cAAc,WAAW,YAAa;AACnD,UAAM,SAAyD;AAAA,MAC3D,KAAK,MAAM,IAAI,MAAM;AAAA,MACrB,MAAM,OAAO,IAAI,QAAQ,WAAW,YAAY;AAAA,MAChD,QAAQ;AAAA,QACJ,MAAO,OAAO,IAAI,UAAU,IAAI,OAAO,QAAS;AAAA,MACpD;AAAA,MACA,QAAS,OAAO,IAAI,UAAW,CAAC;AAAA,IACpC;AACA,WAAO;AAAA,EACX;AAAA,EASA,MAAM,QAAQ,IAAY,KAAsC,MAA8B,MAAqB;AAC/G,SAAK,KAAK,QAAQ,EAAE;AACpB,QAAI,OAAO,KAAK,OAAO,EAAE;AACzB,UAAM,MAAM,CAAC,KAAK,aAAa,EAAE;AAEjC,QAAI,SAAS,QAAW;AACpB,UAAI,CAAC,KAAK;AACN,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAChF;AACA,UAAI,MAAM,GAAG,KAAK,QAAQ,QAAQ,KAAK,QAAQ,YAAY;AAC3D,UAAI,OAAO,IAAI,OAAO,QAAQ;AAAU,YAAI,OAAO,OAAO,MAAM,KAAK,kBAAkB,IAAI,OAAO,IAAI;AACtG,UAAI,CAAC;AAAK,cAAM,KAAK,QAAQ,kBAAkB,IAAI,GAAG;AACtD,YAAM,YAAY,OAAO,IAAI,UAAU,IAAI,OAAO;AAClD,aAAO,KAAK,MAAM,IAAI,IAAI,MAAM,QAAW,WAAW,MAAM,KAAK,IAAI,GAAG,GAAG;AAAA,IAC/E,WAAW,KAAK,QAAQ,KAAK;AACzB,UAAI,OAAO,IAAI,OAAO,QAAQ;AAAU,YAAI,OAAO,OAAO,MAAM,KAAK,kBAAkB,IAAI,OAAO,IAAI;AACtG,UAAI,CAAC;AAAK,cAAM,KAAK,QAAQ,kBAAkB,IAAI,GAAG;AAAA,IAC1D;AAEA,QAAI,OAAO,IAAI,SAAS;AAAS;AAEjC,QAAI;AAAM,WAAK,MAAM,IAAI,KAAK,MAAM,KAAK,KAAK,UAAU,IAAI;AAE5D,QAAI,SAAS,KAAK,SAAS,2BAA2B,KAAK,OAAO,OAAO,CAAC,KAAK,MAAM;AACjF,YAAM,MAAO,OAAO,IAAI,UAAU,IAAI,OAAO,QAAS,KAAK;AAC3D,UAAI,OAAO,OAAO,OAAO,OAAO,QAAQ;AAAW,cAAM,KAAK,cAAc,KAAK,GAAG;AACpF,UAAI,CAAC;AACD,cAAM,KAAK,QAAQ,cAAc,IAAI;AAAA,UACjC;AAAA,UACA,IAAI,KAAK,IAAI;AAAA,UACb,KAAK;AAAA,QACT,CAAC;AAAA,IACT;AAAA,EACJ;AAAA,EAEA,iBAAiB,MAAmB;AAChC,SAAK,gBAAgB,KAAK,cAAc,OAAO,IAAI;AAAA,EACvD;AAAA,EAEA,aAAa,IAAqB;AAC9B,QAAI,MAAM,GAAG,MAAM,GAAG,EAAE,UAAU;AAAG,aAAO;AAC5C,eAAW,KAAK,KAAK,eAAe;AAChC,UAAI,GAAG,OAAO,IAAI,OAAO,KAAK,cAAc,IAAI,GAAG,CAAC,KAAK,IAAI;AACzD,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,KAAiD;AACvD,UAAM,SAA6C,CAAC;AACpD,eAAW,MAAM,KAAK,eAAe;AACjC,UAAI,GAAG,OAAO,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,IAAI;AACvC,eAAO,MAAM,KAAK,cAAc;AAAA,MACpC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,YAAY,MAAgB,QAAyB,MAA6B;AACpF,QAAI,MAAM,CAAC;AACX,eAAW,MAAM,KAAK,eAAe;AACjC,UAAI,UAAU,OAAO,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU;AAAG;AACtF,UAAI,KAAK,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS;AAAG;AACzE,aAAO,KAAK,cAAc;AAC1B,UAAI,KAAK,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;AAAA,IACnD;AACA,UAAM,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;AACjC,aAAO,IAAI,QAAQ,IAAI,KAAK;AAAA,IAChC,CAAC;AACD,eAAW,KAAK,KAAK;AACjB,YAAM,KAAK,QAAQ,eAAe,IAAI,IAAI,EAAE,WAAW,KAAK,CAAC;AAC7D,WAAK,IAAI,MAAM,yBAAyB,IAAI,IAAI;AAAA,IACpD;AAAA,EACJ;AAAA,EAQA,QAAQ,QAAgB,YAAqB,OAAe;AACxD,QAAI,CAAC,UAAU,OAAO,UAAU;AAAU,aAAO;AAEjD,aAAS,OAAO,QAAQ,KAAK,QAAQ,iBAAiB,GAAG;AAEzD,aAAS,OAAO,QAAQ,sBAAsB,GAAG;AACjD,WAAO,YAAY,OAAO,YAAY,IAAI;AAAA,EAC9C;AAAA,EAOA,cAAc,OAAgD,MAAmC;AAC7F,QAAI,UAAU;AAAM,aAAO;AAC3B,QAAI,SAAS,QAAW;AACpB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC/D;AACA,QAAI,UAAU;AAAW,cAAQ;AAEjC,UAAM,WAAW,OAAO;AACxB,QAAI,WAAgC,OAAO,SAAS,WAAW,KAAK,UAAU,KAAK,IAAI;AAEvF,QAAI,SAAS,UAAU;AACnB,cAAQ,MAAM;AAAA,QACV,KAAK;AACD,qBAAW,MAAM,SAAS,KAAK;AAC/B;AAAA,QACJ,KAAK;AACD,qBAAW,QAAQ,OAAO,KAAK,IAAI;AACnC;AAAA,QACJ,KAAK;AACD,qBAAW,CAAC,CAAC;AACb;AAAA,QACJ,KAAK;AAAA,QACL,KAAK;AAED;AAAA,MACR;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,IAA6B;AAChC,WAAO,KAAK,cAAc,KAAK,QAAQ,EAAE;AAAA,EAC7C;AAAA,EAEA,MACI,IACA,MACA,KACA,WACA,MAAe,MACf,KAAa,KAAK,IAAI,GACtB,MAAmC,QACnC,OAAgB,OACD;AACf,SAAK,cAAc,MAAM;AAAA,MACrB;AAAA,MACA,UACI,cAAc,SACR,YACA,KAAK,cAAc,QAAQ,UAAa,KAAK,cAAc,IAAK,aAAa,SAC3E,KAAK,cAAc,IAAK,WACxB;AAAA,MACZ;AAAA,MACA;AAAA,MACA,IAAI,KAAK,KAAK,KAAK,IAAI;AAAA,MACvB,KACI,QAAQ,SACF,MACA,KAAK,cAAc,QAAQ,UAAa,KAAK,cAAc,IAAK,QAAQ,SACtE,KAAK,cAAc,IAAK,MACxB;AAAA,MACZ;AAAA,IACJ;AACA,WAAO,KAAK,cAAc;AAAA,EAC9B;AAAA,EAEA,MAAM,kBAAkB,MAA4B;AAChD,eAAW,KAAK;AAAM,YAAM,EAAE,OAAO;AAAA,EACzC;AAAA,EAEA,YAAY,KAAuC;AAC/C,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,IAAI,MAAM,sCAAsC,OAAO,KAAK;AACjE,aAAO;AAAA,IACX;AACA,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACzC;AAAA,EAEA,mBAAmB,KAAqB;AACpC,QAAI,OAAO,QAAQ,UAAU;AACzB,WAAK,IAAI,MAAM,sCAAsC,OAAO,KAAK;AACjE,aAAO;AAAA,IACX;AACA,WAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,eAAe,MAAgC;AACjD,QAAI,MAAM,UAAAA,QAAI,WAAW,WAAW,MAAM;AAAG,aAAO;AACpD,WAAO;AAAA,EACX;AAAA,EAOA,MAAM,WAAW,QAAkG;AAC/G,QAAI,CAAC;AAAQ;AACb,UAAM,kBAA4B,CAAC;AACnC,eAAW,SAAS,QAAQ;AACxB,YAAM,KAAK,MAAM,QAAQ,GAAG,KAAK,QAAQ,QAAQ,KAAK,QAAQ,aAAa,EAAE;AAC7E,YAAM,MAAM,CAAC,KAAK,aAAa,EAAE;AACjC,UAAI,CAAC,KAAK;AACN,cAAM,MAAM,MAAM,KAAK,QAAQ,eAAe,EAAE;AAChD,aAAK;AAAA,UACD;AAAA,UACA;AAAA,UACA,OAAO,UAAU,OAAO,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,UACzD,OAAO,IAAI,UAAU,IAAI,OAAO,OAAO,IAAI,OAAO,OAAO;AAAA,UACzD,OAAO,UAAU,OAAO,OAAO;AAAA,UAC/B,OAAO,UAAU,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI;AAAA,UAChE,OAAO,OAAO,SAAY;AAAA,UAC1B;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,YAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC;AAAG;AACtD,cAAM,UAAU,GAAG,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAClD,wBAAgB,KAAK,OAAO;AAC5B,cAAM,KAAK,QAAQ,eAAe,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9D,aAAK,IAAI,MAAM,4BAA4B,OAAO;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ;AAAA,EAQA,MAAM,iBAAiB,QAAgB,SAAiB,KAAM,MAAM,OAAsB;AACtF,QAAI,CAAC;AAAQ;AACb,QAAI,KAAK,eAAe;AACpB,iBAAW,MAAM,KAAK,eAAe;AACjC,YAAI,GAAG,WAAW,MAAM,GAAG;AACvB,gBAAM,QAAQ,KAAK,cAAc;AACjC,cAAI,CAAC,SAAS,MAAM,OAAO;AAAW;AACtC,cAAI,MAAM,KAAK,KAAK,IAAI,IAAI,QAAQ;AAChC,gBAAI,KAAK;AACL,oBAAM,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE;AACnC;AAAA,YACJ;AACA,gBAAI;AACJ,oBAAQ,MAAM,UAAU;AAAA,cACpB,KAAK;AACD,oBAAI,OAAO,MAAM,OAAO,UAAU;AAC9B,sBAAI,MAAM,IAAI,WAAW,GAAG,KAAK,MAAM,IAAI,SAAS,GAAG;AAAG,6BAAS;AAAA,2BAC1D,MAAM,IAAI,WAAW,GAAG,KAAK,MAAM,IAAI,SAAS,GAAG;AAAG,6BAAS;AAAA;AACnE,6BAAS;AAAA,gBAClB;AAAO,2BAAS;AAChB;AAAA,cACJ,KAAK;AAAA,cACL,KAAK;AACD,yBAAS;AACT;AAAA,cAEJ,KAAK;AACD,yBAAS;AACT;AAAA,cACJ,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AACD,yBAAS;AACT;AAAA,cACJ,KAAK;AACD,yBAAS;AACT;AAAA,YACR;AACA,kBAAM,KAAK,QAAQ,IAAI,MAAM;AAAA,UACjC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,mBAA2B;AACvB,QAAI,KAAK;AAAU,aAAO,KAAK;AAC/B,WAAO;AAAA,EACX;AAAA,EACA,eAAe,KAAqB;AAChC,QAAI,KAAK,YAAY,SAAS;AAAW,aAAO,KAAK,YAAY;AACjE,WAAO;AAAA,EACX;AAAA,EACA,iBAAiB,KAAsB;AACnC,WAAO,KAAK,YAAY,SAAS;AAAA,EACrC;AAAA,EAEA,MAAM,kBAAkB,KAAmD;AACvE,UAAM,WAA0C;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,UAAM,SAAoC,CAAC;AAC3C,eAAW,KAAK,UAAU;AACtB,UAAI;AACA,cAAM,IAAI,MAAM,6BAAO,QAAP,QAAO,oBAAoB;AAC3C,YAAI,EAAE,SAAS;AAAW,iBAAO,KAAe,EAAE;AAAA,MACtD,SAAS,OAAP;AACE,eAAO;AAAA,MACX;AAAA,IACJ;AACA,QAAI,OAAO,SAAS;AAAW,aAAO;AACtC,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,YAAY,UAAqC,QAAQ,OAAyB;AACpF,QAAI,CAAC;AAAU,iBAAW;AAC1B,QAAI,SAAS,KAAK,YAAY,UAAU;AACpC,UAAI;AACA,aAAK,cAAc,MAAM,6BAAO,QAAP,QAAO,oBAAoB;AACpD,aAAK,WAAW;AAChB,eAAO;AAAA,MACX,SAAS,OAAP;AACE,aAAK,IAAI,MAAM,YAAY,qBAAqB;AAAA,MACpD;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,SAAS,MAA0B;AAC/B,SAAK,KAAK,CAAC,GAAG,MAAM;AAChB,YAAM,QAAQ,EAAE,YAAY;AAC5B,YAAM,QAAQ,EAAE,YAAY;AAC5B,UAAI,QAAQ,OAAO;AACf,eAAO;AAAA,MACX;AACA,UAAI,QAAQ,OAAO;AACf,eAAO;AAAA,MACX;AAEA,aAAO;AAAA,IACX,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EAQA,iBAAiB,MAAc,OAAe,IAAI,MAAM,OAAe;AACnE,QAAI,CAAC,QAAQ,OAAO,SAAS;AAAU,aAAO;AAC9C,UAAM,IAAI,KAAK,MAAM,GAAG;AACxB,QAAI,KAAK;AACL,QAAE,KAAK,EAAE,GAAG,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WACI,OAEI,IAAI,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,eAAe,KAAK,UAAU;AAAA,MAClF,SAAS,MAAM,SAAS;AAAA,MACxB,KAAK;AAAA,MACL,OAAO;AAAA,IACX,CAAC,IAAI,KACP,QAAQ,gBAAgB,CAAC,MAAM;AAC7B,YAAM,SAAS,KAAK,eAAe,IAAI,IAAI;AAC3C,UAAI,UAAU,IAAI;AAAM,eAAO;AAC/B,aAAO,KAAK,eAAe,CAAC;AAAA,IAChC,CAAC;AAAA,EAET;AACJ;AACA,eAAsB,MAAM,MAA6B;AACrD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,IAAI,CAAC;AAC7D;", "names": ["_fs"] } diff --git a/build/lib/mqtt.js b/build/lib/mqtt.js index ad0045e..f1050fe 100644 --- a/build/lib/mqtt.js +++ b/build/lib/mqtt.js @@ -95,6 +95,10 @@ class MQTTClientClass extends import_library.BaseClass { this.adapter.handleMessage(topic, value); }); } + async publish(topic, message) { + this.log.debug(`Publishing topic: ${topic} with message: ${message}.`); + await this.client.publishAsync(topic, message); + } destroy() { this.client.end(); } diff --git a/build/lib/mqtt.js.map b/build/lib/mqtt.js.map index 04cfb31..d03aa1d 100644 --- a/build/lib/mqtt.js.map +++ b/build/lib/mqtt.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/lib/mqtt.ts"], - "sourcesContent": ["import mqtt from 'mqtt'; // import namespace \"mqtt\"\nimport { Level } from 'level';\n\n//@ts-expect-error no types\nimport aedesPersistencelevel from 'aedes-persistence-level';\n\nimport { AdapterClassDefinition, BaseClass } from './library';\n\nimport Aedes, { Client } from 'aedes';\nimport { Server, createServer } from 'net';\nimport { Espresense } from '../main';\n\nexport class MQTTClientClass extends BaseClass {\n client: mqtt.MqttClient;\n data: any = {};\n constructor(adapter: AdapterClassDefinition, ip: string, port: number, username: string, password: string) {\n super(adapter, 'mqttClient');\n this.client = mqtt.connect(`mqtt://${ip}:${port}`, { username: username, password: password });\n this.client.on('connect', () => {\n this.log.info(`Connection is active.`);\n this.adapter.setState('info.connection', true, true);\n this.client.subscribe('espresense/#', (err) => {\n if (err) {\n this.log.error(`On subscribe: ${err}`);\n }\n });\n });\n this.client.on('disconnect', () => {\n this.adapter.setState('info.connection', false, true);\n this.log.debug(`disconnected`);\n });\n this.client.on('error', (err) => {\n this.log.error(`${err}`);\n });\n\n this.client.on('close', () => {\n this.adapter.setState('info.connection', false, true);\n this.log.info(`Connection is closed.`);\n });\n\n this.client.on('message', (topic, message) => {\n //this.log.debug('topic: ' + topic + ' message: ' + message.toString() + ' type:');\n let value: any;\n let type: string = '';\n try {\n value = JSON.parse(message.toString());\n if (typeof value == 'string') throw new Error('nope');\n type = typeof value;\n } catch (e: any) {\n value = message.toString();\n if (isNaN(value)) {\n if (value == 'ON' || value == 'OFF') {\n type = 'boolean';\n value = value == 'ON';\n } else {\n type = 'string';\n }\n } else if (value == '') {\n type = 'string';\n } else {\n type = 'number1';\n this.log.debug(typeof value);\n value = parseFloat(value);\n }\n }\n const test = topic.split('/');\n const key = test.pop();\n if (this.data[test.join('_')] === undefined) this.data[test.join('_')] = {};\n if (key !== undefined) this.data[test.join('_')][key] = value;\n\n this.log.debug(`${topic}: ${type} - ${value}`);\n //this.log.debug(`json: ${JSON.stringify(this.data)}`);\n this.adapter.handleMessage(topic, value);\n });\n }\n\n destroy(): void {\n this.client.end();\n }\n}\n\nexport class MQTTServerClass extends BaseClass {\n aedes: Aedes;\n server: Server;\n constructor(adapter: Espresense, port: number, username: string, password: string) {\n super(adapter, 'mqttServer');\n const persistence = aedesPersistencelevel(new Level('./mydb'));\n this.aedes = new Aedes({ persistence: persistence });\n this.server = createServer(this.aedes.handle);\n\n this.server.listen(port, () => {\n this.log.info(`Started and listening on port ${port}`);\n });\n this.aedes.authenticate = (\n client: Client,\n un: Readonly,\n pw: Readonly,\n callback: any,\n ) => {\n const confirm = username === un && password == pw!.toString();\n if (!confirm) this.log.warn(`Login denied client: ${client.id}. User name or password wrong!`);\n else this.log.info(`Client ${client.id} login successful.`);\n callback(null, confirm);\n };\n }\n destroy(): void {\n this.aedes.close();\n this.server.close();\n }\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,mBAAsB;AAGtB,qCAAkC;AAElC,qBAAkD;AAElD,mBAA8B;AAC9B,iBAAqC;AAG9B,MAAM,wBAAwB,yBAAU;AAAA,EAC3C;AAAA,EACA,OAAY,CAAC;AAAA,EACb,YAAY,SAAiC,IAAY,MAAc,UAAkB,UAAkB;AACvG,UAAM,SAAS,YAAY;AAC3B,SAAK,SAAS,YAAAA,QAAK,QAAQ,UAAU,MAAM,QAAQ,EAAE,UAAoB,SAAmB,CAAC;AAC7F,SAAK,OAAO,GAAG,WAAW,MAAM;AAC5B,WAAK,IAAI,KAAK,uBAAuB;AACrC,WAAK,QAAQ,SAAS,mBAAmB,MAAM,IAAI;AACnD,WAAK,OAAO,UAAU,gBAAgB,CAAC,QAAQ;AAC3C,YAAI,KAAK;AACL,eAAK,IAAI,MAAM,iBAAiB,KAAK;AAAA,QACzC;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AACD,SAAK,OAAO,GAAG,cAAc,MAAM;AAC/B,WAAK,QAAQ,SAAS,mBAAmB,OAAO,IAAI;AACpD,WAAK,IAAI,MAAM,cAAc;AAAA,IACjC,CAAC;AACD,SAAK,OAAO,GAAG,SAAS,CAAC,QAAQ;AAC7B,WAAK,IAAI,MAAM,GAAG,KAAK;AAAA,IAC3B,CAAC;AAED,SAAK,OAAO,GAAG,SAAS,MAAM;AAC1B,WAAK,QAAQ,SAAS,mBAAmB,OAAO,IAAI;AACpD,WAAK,IAAI,KAAK,uBAAuB;AAAA,IACzC,CAAC;AAED,SAAK,OAAO,GAAG,WAAW,CAAC,OAAO,YAAY;AAE1C,UAAI;AACJ,UAAI,OAAe;AACnB,UAAI;AACA,gBAAQ,KAAK,MAAM,QAAQ,SAAS,CAAC;AACrC,YAAI,OAAO,SAAS;AAAU,gBAAM,IAAI,MAAM,MAAM;AACpD,eAAO,OAAO;AAAA,MAClB,SAAS,GAAP;AACE,gBAAQ,QAAQ,SAAS;AACzB,YAAI,MAAM,KAAK,GAAG;AACd,cAAI,SAAS,QAAQ,SAAS,OAAO;AACjC,mBAAO;AACP,oBAAQ,SAAS;AAAA,UACrB,OAAO;AACH,mBAAO;AAAA,UACX;AAAA,QACJ,WAAW,SAAS,IAAI;AACpB,iBAAO;AAAA,QACX,OAAO;AACH,iBAAO;AACP,eAAK,IAAI,MAAM,OAAO,KAAK;AAC3B,kBAAQ,WAAW,KAAK;AAAA,QAC5B;AAAA,MACJ;AACA,YAAM,OAAO,MAAM,MAAM,GAAG;AAC5B,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,KAAK,KAAK,KAAK,KAAK,GAAG,OAAO;AAAW,aAAK,KAAK,KAAK,KAAK,GAAG,KAAK,CAAC;AAC1E,UAAI,QAAQ;AAAW,aAAK,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO;AAExD,WAAK,IAAI,MAAM,GAAG,UAAU,UAAU,OAAO;AAE7C,WAAK,QAAQ,cAAc,OAAO,KAAK;AAAA,IAC3C,CAAC;AAAA,EACL;AAAA,EAEA,UAAgB;AACZ,SAAK,OAAO,IAAI;AAAA,EACpB;AACJ;AAEO,MAAM,wBAAwB,yBAAU;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,YAAY,SAAqB,MAAc,UAAkB,UAAkB;AAC/E,UAAM,SAAS,YAAY;AAC3B,UAAM,kBAAc,+BAAAC,SAAsB,IAAI,mBAAM,QAAQ,CAAC;AAC7D,SAAK,QAAQ,IAAI,aAAAC,QAAM,EAAE,YAAyB,CAAC;AACnD,SAAK,aAAS,yBAAa,KAAK,MAAM,MAAM;AAE5C,SAAK,OAAO,OAAO,MAAM,MAAM;AAC3B,WAAK,IAAI,KAAK,iCAAiC,MAAM;AAAA,IACzD,CAAC;AACD,SAAK,MAAM,eAAe,CACtB,QACA,IACA,IACA,aACC;AACD,YAAM,UAAU,aAAa,MAAM,YAAY,GAAI,SAAS;AAC5D,UAAI,CAAC;AAAS,aAAK,IAAI,KAAK,wBAAwB,OAAO,kCAAkC;AAAA;AACxF,aAAK,IAAI,KAAK,UAAU,OAAO,sBAAsB;AAC1D,eAAS,MAAM,OAAO;AAAA,IAC1B;AAAA,EACJ;AAAA,EACA,UAAgB;AACZ,SAAK,MAAM,MAAM;AACjB,SAAK,OAAO,MAAM;AAAA,EACtB;AACJ;", + "sourcesContent": ["import mqtt from 'mqtt'; // import namespace \"mqtt\"\nimport { Level } from 'level';\n\n//@ts-expect-error no types\nimport aedesPersistencelevel from 'aedes-persistence-level';\n\nimport { AdapterClassDefinition, BaseClass } from './library';\n\nimport Aedes, { Client } from 'aedes';\nimport { Server, createServer } from 'net';\nimport { Espresense } from '../main';\n\nexport class MQTTClientClass extends BaseClass {\n client: mqtt.MqttClient;\n data: any = {};\n constructor(adapter: AdapterClassDefinition, ip: string, port: number, username: string, password: string) {\n super(adapter, 'mqttClient');\n this.client = mqtt.connect(`mqtt://${ip}:${port}`, { username: username, password: password });\n this.client.on('connect', () => {\n this.log.info(`Connection is active.`);\n this.adapter.setState('info.connection', true, true);\n this.client.subscribe('espresense/#', (err) => {\n if (err) {\n this.log.error(`On subscribe: ${err}`);\n }\n });\n });\n this.client.on('disconnect', () => {\n this.adapter.setState('info.connection', false, true);\n this.log.debug(`disconnected`);\n });\n this.client.on('error', (err) => {\n this.log.error(`${err}`);\n });\n\n this.client.on('close', () => {\n this.adapter.setState('info.connection', false, true);\n this.log.info(`Connection is closed.`);\n });\n\n this.client.on('message', (topic, message) => {\n //this.log.debug('topic: ' + topic + ' message: ' + message.toString() + ' type:');\n let value: any;\n let type: string = '';\n try {\n value = JSON.parse(message.toString());\n if (typeof value == 'string') throw new Error('nope');\n type = typeof value;\n } catch (e: any) {\n value = message.toString();\n if (isNaN(value)) {\n if (value == 'ON' || value == 'OFF') {\n type = 'boolean';\n value = value == 'ON';\n } else {\n type = 'string';\n }\n } else if (value == '') {\n type = 'string';\n } else {\n type = 'number1';\n this.log.debug(typeof value);\n value = parseFloat(value);\n }\n }\n const test = topic.split('/');\n const key = test.pop();\n if (this.data[test.join('_')] === undefined) this.data[test.join('_')] = {};\n if (key !== undefined) this.data[test.join('_')][key] = value;\n\n this.log.debug(`${topic}: ${type} - ${value}`);\n //this.log.debug(`json: ${JSON.stringify(this.data)}`);\n this.adapter.handleMessage(topic, value);\n });\n }\n async publish(topic: string, message: string): Promise {\n this.log.debug(`Publishing topic: ${topic} with message: ${message}.`);\n await this.client.publishAsync(topic, message);\n }\n\n destroy(): void {\n this.client.end();\n }\n}\n\nexport class MQTTServerClass extends BaseClass {\n aedes: Aedes;\n server: Server;\n constructor(adapter: Espresense, port: number, username: string, password: string) {\n super(adapter, 'mqttServer');\n const persistence = aedesPersistencelevel(new Level('./mydb'));\n this.aedes = new Aedes({ persistence: persistence });\n this.server = createServer(this.aedes.handle);\n\n this.server.listen(port, () => {\n this.log.info(`Started and listening on port ${port}`);\n });\n this.aedes.authenticate = (\n client: Client,\n un: Readonly,\n pw: Readonly,\n callback: any,\n ) => {\n const confirm = username === un && password == pw!.toString();\n if (!confirm) this.log.warn(`Login denied client: ${client.id}. User name or password wrong!`);\n else this.log.info(`Client ${client.id} login successful.`);\n callback(null, confirm);\n };\n }\n destroy(): void {\n this.aedes.close();\n this.server.close();\n }\n}\n"], + "mappings": "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", "names": ["mqtt", "aedesPersistencelevel", "Aedes"] } diff --git a/build/main.js b/build/main.js index 0b83762..ebadc47 100644 --- a/build/main.js +++ b/build/main.js @@ -52,59 +52,62 @@ class Espresense extends utils.Adapter { } async onReady() { this.setStateAsync("info.connection", false, true); - await this.library.init(); - await this.library.initStates(await this.getStatesAsync("*")); - this.library.defaults.updateStateOnChangeOnly = false; - this.library.writedp("devices", void 0, import_definition.genericStateObjects.devices); - this.library.writedp("rooms", void 0, import_definition.genericStateObjects.rooms); - this.library.writedp("settings", void 0, import_definition.genericStateObjects.configs); - this.namedDevices = {}; - let testIt = this.config.MQTTServerIp; - if (testIt == "" || typeof testIt != "string") { - this.log.warn(`Invalid configuration mqtt server ip has unexpeted value: ${testIt}`); - return; - } - testIt = this.config.MQTTServerPort; - if (typeof testIt != "number" || testIt <= 1023) { - this.log.warn(`Invalid configuration mqtt server port has unexpeted value: ${testIt}`); - return; - } - testIt = this.config.MQTTPassword; - if (typeof testIt != "string") { - this.log.error(`Invalid configuration mqtt server password has unexpeted value type ${typeof testIt}`); - return; - } - testIt = this.config.MQTTUsername; - if (typeof testIt != "string") { - this.log.error(`Invalid configuration mqtt username has unexpeted value typ: ${typeof testIt}`); - return; - } - testIt = this.config.unseenTime; - if (isNaN(testIt) || testIt == "" || testIt < 5) { - this.config.unseenTime = 20; - } - this.config.unseenTime *= 1e3; - if (this.config.MQTTUseServer) { - this.mqttServer = new import_mqtt.MQTTServerClass( + setTimeout(async () => { + await this.library.init(); + await this.library.initStates(await this.getStatesAsync("*")); + this.library.defaults.updateStateOnChangeOnly = false; + this.library.writedp("devices", void 0, import_definition.genericStateObjects.devices); + this.library.writedp("rooms", void 0, import_definition.genericStateObjects.rooms); + this.library.writedp("settings", void 0, import_definition.genericStateObjects.settings); + await this.subscribeStatesAsync("rooms.*"); + this.namedDevices = {}; + let testIt = this.config.MQTTServerIp; + if (testIt == "" || typeof testIt != "string") { + this.log.warn(`Invalid configuration mqtt server ip has unexpeted value: ${testIt}`); + return; + } + testIt = this.config.MQTTServerPort; + if (typeof testIt != "number" || testIt <= 1023) { + this.log.warn(`Invalid configuration mqtt server port has unexpeted value: ${testIt}`); + return; + } + testIt = this.config.MQTTPassword; + if (typeof testIt != "string") { + this.log.error(`Invalid configuration mqtt server password has unexpeted value type ${typeof testIt}`); + return; + } + testIt = this.config.MQTTUsername; + if (typeof testIt != "string") { + this.log.error(`Invalid configuration mqtt username has unexpeted value typ: ${typeof testIt}`); + return; + } + testIt = this.config.unseenTime; + if (isNaN(testIt) || testIt == "" || testIt < 5) { + this.config.unseenTime = 20; + } + this.config.unseenTime *= 1e3; + if (this.config.MQTTUseServer) { + this.mqttServer = new import_mqtt.MQTTServerClass( + this, + this.config.MQTTServerPort, + this.config.MQTTUsername, + this.config.MQTTPassword + ); + } + this.mqttClient = new import_mqtt.MQTTClientClass( this, + this.config.MQTTUseServer ? "127.0.0.1" : this.config.MQTTServerIp, this.config.MQTTServerPort, this.config.MQTTUsername, this.config.MQTTPassword ); - } - this.mqttClient = new import_mqtt.MQTTClientClass( - this, - this.config.MQTTUseServer ? "127.0.0.1" : this.config.MQTTServerIp, - this.config.MQTTServerPort, - this.config.MQTTUsername, - this.config.MQTTPassword - ); - this.timeout = this.setInterval(() => { - this.library.garbageColleting("devices.", this.config.unseenTime); - }, this.unseenCheckTime); - this.timeoutDelete = this.setInterval(() => { - this.library.garbageColleting("devices.", 2592e6, true); - }, 36e5); + this.timeout = this.setInterval(() => { + this.library.garbageColleting("devices.", this.config.unseenTime); + }, this.unseenCheckTime); + this.timeoutDelete = this.setInterval(() => { + this.library.garbageColleting("devices.", 2592e6, true); + }, 36e5); + }, 1e3); } async handleMessage(topic, message) { if (!topic || message == void 0) @@ -123,25 +126,14 @@ class Espresense extends utils.Adapter { temp.common.name = this.namedDevices[device] || device; await this.library.writedp(`${typ}.${device}`, void 0, temp); if (typ === "rooms") { + if (topicA[topicA.length - 1] == "set") + return; const data = {}; data[topicA.join(".")] = message; await this.library.writeFromJson(`${typ}.${device}`, typ, import_definition.statesObjects, data); } else if (typ === "settings") { const data = {}; this.namedDevices[message.id] = message.name; - const states = await this.library.getStates(`\\.${message.id}\\.`); - for (const dp in states) { - if (states[dp] !== void 0) - this.library.setdb( - dp, - states[dp].type, - states[dp].val, - states[dp].stateTyp, - states[dp].ack, - states[dp].ts, - true - ); - } data[topicA.join(".")] = message; await this.library.writeFromJson(`${typ}.${device}`, typ, import_definition.statesObjects, data); if (typ === "settings") @@ -171,11 +163,23 @@ class Espresense extends utils.Adapter { callback(); } } - onStateChange(id, state) { - if (state) { - this.log.info(`state ${id} changed: ${state.val} (ack = ${state.ack})`); + async onStateChange(id, state) { + if (state && !state.ack) { + id = id.replace(`${this.namespace}.`, ""); + this.library.setdb(id, "state", state.val, void 0, state.ack, state.ts); + const dbEntry = this.library.readdp(id); + if (dbEntry && dbEntry.obj && dbEntry.obj.common && dbEntry.obj.common.write) { + const native = dbEntry.obj.native; + let val = dbEntry.val; + if (native && native.convert) { + const fn = new Function("val", `return ${native.convert}`); + val = fn(val); + } + const topic = `espresense/${id.split(".").join("/")}/set`; + if (this.mqttClient) + await this.mqttClient.publish(topic, String(val)); + } } else { - this.log.info(`state ${id} deleted`); } } } diff --git a/build/main.js.map b/build/main.js.map index 42bf811..90c16a6 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main.ts"], - "sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.5.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core';\nimport { Library } from './lib/library.js';\nimport { MQTTClientClass, MQTTServerClass } from './lib/mqtt.js';\nimport { genericStateObjects, statesObjects } from './lib/definition.js';\nimport 'source-map-support/register';\n\n// Load your modules here, e.g.:\n// import * as fs from \"fs\";\n\nexport class Espresense extends utils.Adapter {\n library: Library;\n mqttClient: MQTTClientClass | undefined;\n mqttServer: MQTTServerClass | undefined;\n namedDevices: { [key: string]: string } = {};\n timeout: ioBroker.Interval | undefined = undefined;\n timeoutDelete: ioBroker.Interval | undefined = undefined;\n unseenCheckTime: number = 10000;\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'espresense',\n });\n this.library = new Library(this);\n this.on('ready', this.onReady.bind(this));\n this.on('stateChange', this.onStateChange.bind(this));\n // this.on('objectChange', this.onObjectChange.bind(this));\n // this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Reset the connection indicator during startup\n this.setStateAsync('info.connection', false, true);\n\n await this.library.init();\n await this.library.initStates(await this.getStatesAsync('*'));\n this.library.defaults.updateStateOnChangeOnly = false;\n\n this.library.writedp('devices', undefined, genericStateObjects.devices);\n this.library.writedp('rooms', undefined, genericStateObjects.rooms);\n this.library.writedp('settings', undefined, genericStateObjects.configs);\n\n this.namedDevices = {};\n //check config\n let testIt: any = this.config.MQTTServerIp;\n if (testIt == '' || typeof testIt != 'string') {\n this.log.warn(`Invalid configuration mqtt server ip has unexpeted value: ${testIt}`);\n return;\n }\n testIt = this.config.MQTTServerPort;\n if (typeof testIt != 'number' || testIt <= 1023) {\n this.log.warn(`Invalid configuration mqtt server port has unexpeted value: ${testIt}`);\n return;\n }\n testIt = this.config.MQTTPassword;\n if (typeof testIt != 'string') {\n this.log.error(`Invalid configuration mqtt server password has unexpeted value type ${typeof testIt}`);\n return;\n }\n testIt = this.config.MQTTUsername;\n if (typeof testIt != 'string') {\n this.log.error(`Invalid configuration mqtt username has unexpeted value typ: ${typeof testIt}`);\n return;\n }\n testIt = this.config.unseenTime;\n if (isNaN(testIt) || testIt == '' || testIt < 5) {\n this.config.unseenTime = 20;\n }\n this.config.unseenTime *= 1000;\n // configuration ok\n if (this.config.MQTTUseServer) {\n this.mqttServer = new MQTTServerClass(\n this,\n this.config.MQTTServerPort,\n this.config.MQTTUsername,\n this.config.MQTTPassword,\n );\n }\n this.mqttClient = new MQTTClientClass(\n this,\n this.config.MQTTUseServer ? '127.0.0.1' : this.config.MQTTServerIp,\n this.config.MQTTServerPort,\n this.config.MQTTUsername,\n this.config.MQTTPassword,\n );\n this.timeout = this.setInterval(() => {\n this.library.garbageColleting('devices.', this.config.unseenTime);\n }, this.unseenCheckTime);\n this.timeoutDelete = this.setInterval(() => {\n this.library.garbageColleting('devices.', 2592000000, true);\n }, 3600000);\n }\n\n async handleMessage(topic: string, message: any): Promise {\n if (!topic || message == undefined) return;\n const topicA = topic.split('/');\n topicA.shift();\n const typ = topicA.shift();\n if (typ !== 'rooms' && typ !== 'settings' && typ !== 'devices') return;\n const temp = this.library.cloneGenericObject(statesObjects[typ]._channel) as ioBroker.DeviceObject;\n\n let device = topicA.shift();\n device = device ? device : 'no_name';\n if (message && typeof message.name && message.id) {\n this.namedDevices[message.id] = message.name;\n }\n temp.common.name = this.namedDevices[device] || device;\n\n await this.library.writedp(`${typ}.${device}`, undefined, temp);\n\n if (typ === 'rooms') {\n const data: any = {};\n data[topicA.join('.')] = message;\n await this.library.writeFromJson(`${typ}.${device}`, typ, statesObjects, data);\n } else if (typ === 'settings') {\n const data: any = {};\n this.namedDevices[message.id] = message.name;\n\n const states = await this.library.getStates(`\\\\.${message.id}\\\\.`);\n for (const dp in states) {\n if (states[dp] !== undefined)\n this.library.setdb(\n dp,\n states[dp]!.type,\n states[dp]!.val,\n states[dp]!.stateTyp,\n states[dp]!.ack,\n states[dp]!.ts,\n true,\n );\n }\n\n data[topicA.join('.')] = message;\n await this.library.writeFromJson(`${typ}.${device}`, typ, statesObjects, data);\n if (typ === 'settings') this.log.debug(JSON.stringify(data));\n } else if (typ === 'devices') {\n let subDevice = topicA.shift();\n subDevice = subDevice ? subDevice : 'no_name';\n const temp = this.library.cloneGenericObject(statesObjects[typ]._channel) as ioBroker.DeviceObject;\n temp.common.name = this.namedDevices[subDevice] || subDevice;\n await this.library.writedp(`${typ}.${device}.${subDevice}`, undefined, temp);\n await this.library.writedp(`${typ}.${device}.presense`, true, genericStateObjects.presense);\n await this.library.writeFromJson(`${typ}.${device}.${subDevice}`, typ, statesObjects, message);\n }\n }\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n if (this.mqttClient) this.mqttClient.destroy();\n if (this.mqttServer) this.mqttServer.destroy();\n if (this.timeoutDelete) this.clearInterval(this.timeoutDelete);\n if (this.timeout) this.clearInterval(this.timeout);\n callback();\n } catch (e) {\n callback();\n }\n }\n\n // If you need to react to object changes, uncomment the following block and the corresponding line in the constructor.\n // You also need to subscribe to the objects with `this.subscribeObjects`, similar to `this.subscribeStates`.\n // /**\n // * Is called if a subscribed object changes\n // */\n // private onObjectChange(id: string, obj: ioBroker.Object | null | undefined): void {\n // if (obj) {\n // // The object was changed\n // this.log.info(`object ${id} changed: ${JSON.stringify(obj)}`);\n // } else {\n // // The object was deleted\n // this.log.info(`object ${id} deleted`);\n // }\n // }\n\n /**\n * Is called if a subscribed state changes\n */\n private onStateChange(id: string, state: ioBroker.State | null | undefined): void {\n if (state) {\n // The state was changed\n this.log.info(`state ${id} changed: ${state.val} (ack = ${state.ack})`);\n } else {\n // The state was deleted\n this.log.info(`state ${id} deleted`);\n }\n }\n\n // If you need to accept messages in your adapter, uncomment the following block and the corresponding line in the constructor.\n // /**\n // * Some message was sent to this instance over message box. Used by email, pushover, text2speech, ...\n // * Using this method requires \"common.messagebox\" property to be set to true in io-package.json\n // */\n // private onMessage(obj: ioBroker.Message): void {\n // if (typeof obj === 'object' && obj.message) {\n // if (obj.command === 'send') {\n // // e.g. send email or pushover or whatever\n // this.log.info('send command');\n\n // // Send response in callback if required\n // if (obj.callback) this.sendTo(obj.from, obj.command, 'Message received', obj.callback);\n // }\n // }\n // }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new Espresense(options);\n} else {\n // otherwise start the instance directly\n (() => new Espresense())();\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,YAAuB;AACvB,qBAAwB;AACxB,kBAAiD;AACjD,wBAAmD;AACnD,sBAAO;AAKA,MAAM,mBAAmB,MAAM,QAAQ;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAA0C,CAAC;AAAA,EAC3C,UAAyC;AAAA,EACzC,gBAA+C;AAAA,EAC/C,kBAA0B;AAAA,EACnB,YAAY,UAAyC,CAAC,GAAG;AAC5D,UAAM;AAAA,MACF,GAAG;AAAA,MACH,MAAM;AAAA,IACV,CAAC;AACD,SAAK,UAAU,IAAI,uBAAQ,IAAI;AAC/B,SAAK,GAAG,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC;AACxC,SAAK,GAAG,eAAe,KAAK,cAAc,KAAK,IAAI,CAAC;AAGpD,SAAK,GAAG,UAAU,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EAC9C;AAAA,EAKA,MAAc,UAAyB;AAEnC,SAAK,cAAc,mBAAmB,OAAO,IAAI;AAEjD,UAAM,KAAK,QAAQ,KAAK;AACxB,UAAM,KAAK,QAAQ,WAAW,MAAM,KAAK,eAAe,GAAG,CAAC;AAC5D,SAAK,QAAQ,SAAS,0BAA0B;AAEhD,SAAK,QAAQ,QAAQ,WAAW,QAAW,sCAAoB,OAAO;AACtE,SAAK,QAAQ,QAAQ,SAAS,QAAW,sCAAoB,KAAK;AAClE,SAAK,QAAQ,QAAQ,YAAY,QAAW,sCAAoB,OAAO;AAEvE,SAAK,eAAe,CAAC;AAErB,QAAI,SAAc,KAAK,OAAO;AAC9B,QAAI,UAAU,MAAM,OAAO,UAAU,UAAU;AAC3C,WAAK,IAAI,KAAK,6DAA6D,QAAQ;AACnF;AAAA,IACJ;AACA,aAAS,KAAK,OAAO;AACrB,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,WAAK,IAAI,KAAK,+DAA+D,QAAQ;AACrF;AAAA,IACJ;AACA,aAAS,KAAK,OAAO;AACrB,QAAI,OAAO,UAAU,UAAU;AAC3B,WAAK,IAAI,MAAM,uEAAuE,OAAO,QAAQ;AACrG;AAAA,IACJ;AACA,aAAS,KAAK,OAAO;AACrB,QAAI,OAAO,UAAU,UAAU;AAC3B,WAAK,IAAI,MAAM,gEAAgE,OAAO,QAAQ;AAC9F;AAAA,IACJ;AACA,aAAS,KAAK,OAAO;AACrB,QAAI,MAAM,MAAM,KAAK,UAAU,MAAM,SAAS,GAAG;AAC7C,WAAK,OAAO,aAAa;AAAA,IAC7B;AACA,SAAK,OAAO,cAAc;AAE1B,QAAI,KAAK,OAAO,eAAe;AAC3B,WAAK,aAAa,IAAI;AAAA,QAClB;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,KAAK,OAAO;AAAA,QACZ,KAAK,OAAO;AAAA,MAChB;AAAA,IACJ;AACA,SAAK,aAAa,IAAI;AAAA,MAClB;AAAA,MACA,KAAK,OAAO,gBAAgB,cAAc,KAAK,OAAO;AAAA,MACtD,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO;AAAA,IAChB;AACA,SAAK,UAAU,KAAK,YAAY,MAAM;AAClC,WAAK,QAAQ,iBAAiB,YAAY,KAAK,OAAO,UAAU;AAAA,IACpE,GAAG,KAAK,eAAe;AACvB,SAAK,gBAAgB,KAAK,YAAY,MAAM;AACxC,WAAK,QAAQ,iBAAiB,YAAY,QAAY,IAAI;AAAA,IAC9D,GAAG,IAAO;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,OAAe,SAA6B;AAC5D,QAAI,CAAC,SAAS,WAAW;AAAW;AACpC,UAAM,SAAS,MAAM,MAAM,GAAG;AAC9B,WAAO,MAAM;AACb,UAAM,MAAM,OAAO,MAAM;AACzB,QAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ;AAAW;AAChE,UAAM,OAAO,KAAK,QAAQ,mBAAmB,gCAAc,KAAK,QAAQ;AAExE,QAAI,SAAS,OAAO,MAAM;AAC1B,aAAS,SAAS,SAAS;AAC3B,QAAI,WAAW,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAC9C,WAAK,aAAa,QAAQ,MAAM,QAAQ;AAAA,IAC5C;AACA,SAAK,OAAO,OAAO,KAAK,aAAa,WAAW;AAEhD,UAAM,KAAK,QAAQ,QAAQ,GAAG,OAAO,UAAU,QAAW,IAAI;AAE9D,QAAI,QAAQ,SAAS;AACjB,YAAM,OAAY,CAAC;AACnB,WAAK,OAAO,KAAK,GAAG,KAAK;AACzB,YAAM,KAAK,QAAQ,cAAc,GAAG,OAAO,UAAU,KAAK,iCAAe,IAAI;AAAA,IACjF,WAAW,QAAQ,YAAY;AAC3B,YAAM,OAAY,CAAC;AACnB,WAAK,aAAa,QAAQ,MAAM,QAAQ;AAExC,YAAM,SAAS,MAAM,KAAK,QAAQ,UAAU,MAAM,QAAQ,OAAO;AACjE,iBAAW,MAAM,QAAQ;AACrB,YAAI,OAAO,QAAQ;AACf,eAAK,QAAQ;AAAA,YACT;AAAA,YACA,OAAO,IAAK;AAAA,YACZ,OAAO,IAAK;AAAA,YACZ,OAAO,IAAK;AAAA,YACZ,OAAO,IAAK;AAAA,YACZ,OAAO,IAAK;AAAA,YACZ;AAAA,UACJ;AAAA,MACR;AAEA,WAAK,OAAO,KAAK,GAAG,KAAK;AACzB,YAAM,KAAK,QAAQ,cAAc,GAAG,OAAO,UAAU,KAAK,iCAAe,IAAI;AAC7E,UAAI,QAAQ;AAAY,aAAK,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,IAC/D,WAAW,QAAQ,WAAW;AAC1B,UAAI,YAAY,OAAO,MAAM;AAC7B,kBAAY,YAAY,YAAY;AACpC,YAAMA,QAAO,KAAK,QAAQ,mBAAmB,gCAAc,KAAK,QAAQ;AACxE,MAAAA,MAAK,OAAO,OAAO,KAAK,aAAa,cAAc;AACnD,YAAM,KAAK,QAAQ,QAAQ,GAAG,OAAO,UAAU,aAAa,QAAWA,KAAI;AAC3E,YAAM,KAAK,QAAQ,QAAQ,GAAG,OAAO,mBAAmB,MAAM,sCAAoB,QAAQ;AAC1F,YAAM,KAAK,QAAQ,cAAc,GAAG,OAAO,UAAU,aAAa,KAAK,iCAAe,OAAO;AAAA,IACjG;AAAA,EACJ;AAAA,EAIQ,SAAS,UAA4B;AACzC,QAAI;AACA,UAAI,KAAK;AAAY,aAAK,WAAW,QAAQ;AAC7C,UAAI,KAAK;AAAY,aAAK,WAAW,QAAQ;AAC7C,UAAI,KAAK;AAAe,aAAK,cAAc,KAAK,aAAa;AAC7D,UAAI,KAAK;AAAS,aAAK,cAAc,KAAK,OAAO;AACjD,eAAS;AAAA,IACb,SAAS,GAAP;AACE,eAAS;AAAA,IACb;AAAA,EACJ;AAAA,EAoBQ,cAAc,IAAY,OAAgD;AAC9E,QAAI,OAAO;AAEP,WAAK,IAAI,KAAK,SAAS,eAAe,MAAM,cAAc,MAAM,MAAM;AAAA,IAC1E,OAAO;AAEH,WAAK,IAAI,KAAK,SAAS,YAAY;AAAA,IACvC;AAAA,EACJ;AAkBJ;AAEA,IAAI,QAAQ,SAAS,QAAQ;AAEzB,SAAO,UAAU,CAAC,YAAuD,IAAI,WAAW,OAAO;AACnG,OAAO;AAEH,GAAC,MAAM,IAAI,WAAW,GAAG;AAC7B;", + "sourcesContent": ["/*\n * Created with @iobroker/create-adapter v2.5.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\n// you need to create an adapter\nimport * as utils from '@iobroker/adapter-core';\nimport { Library } from './lib/library.js';\nimport { MQTTClientClass, MQTTServerClass } from './lib/mqtt.js';\nimport { genericStateObjects, statesObjects } from './lib/definition.js';\nimport 'source-map-support/register';\n\n// Load your modules here, e.g.:\n// import * as fs from \"fs\";\n\nexport class Espresense extends utils.Adapter {\n library: Library;\n mqttClient: MQTTClientClass | undefined;\n mqttServer: MQTTServerClass | undefined;\n namedDevices: { [key: string]: string } = {};\n timeout: ioBroker.Interval | undefined = undefined;\n timeoutDelete: ioBroker.Interval | undefined = undefined;\n unseenCheckTime: number = 10000;\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'espresense',\n });\n this.library = new Library(this);\n this.on('ready', this.onReady.bind(this));\n this.on('stateChange', this.onStateChange.bind(this));\n // this.on('objectChange', this.onObjectChange.bind(this));\n // this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this));\n }\n\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Reset the connection indicator during startup\n this.setStateAsync('info.connection', false, true);\n setTimeout(async () => {\n await this.library.init();\n await this.library.initStates(await this.getStatesAsync('*'));\n this.library.defaults.updateStateOnChangeOnly = false;\n\n this.library.writedp('devices', undefined, genericStateObjects.devices);\n this.library.writedp('rooms', undefined, genericStateObjects.rooms);\n this.library.writedp('settings', undefined, genericStateObjects.settings);\n await this.subscribeStatesAsync('rooms.*');\n this.namedDevices = {};\n //check config\n let testIt: any = this.config.MQTTServerIp;\n if (testIt == '' || typeof testIt != 'string') {\n this.log.warn(`Invalid configuration mqtt server ip has unexpeted value: ${testIt}`);\n return;\n }\n testIt = this.config.MQTTServerPort;\n if (typeof testIt != 'number' || testIt <= 1023) {\n this.log.warn(`Invalid configuration mqtt server port has unexpeted value: ${testIt}`);\n return;\n }\n testIt = this.config.MQTTPassword;\n if (typeof testIt != 'string') {\n this.log.error(`Invalid configuration mqtt server password has unexpeted value type ${typeof testIt}`);\n return;\n }\n testIt = this.config.MQTTUsername;\n if (typeof testIt != 'string') {\n this.log.error(`Invalid configuration mqtt username has unexpeted value typ: ${typeof testIt}`);\n return;\n }\n testIt = this.config.unseenTime;\n if (isNaN(testIt) || testIt == '' || testIt < 5) {\n this.config.unseenTime = 20;\n }\n this.config.unseenTime *= 1000;\n // configuration ok\n if (this.config.MQTTUseServer) {\n this.mqttServer = new MQTTServerClass(\n this,\n this.config.MQTTServerPort,\n this.config.MQTTUsername,\n this.config.MQTTPassword,\n );\n }\n this.mqttClient = new MQTTClientClass(\n this,\n this.config.MQTTUseServer ? '127.0.0.1' : this.config.MQTTServerIp,\n this.config.MQTTServerPort,\n this.config.MQTTUsername,\n this.config.MQTTPassword,\n );\n this.timeout = this.setInterval(() => {\n this.library.garbageColleting('devices.', this.config.unseenTime);\n }, this.unseenCheckTime);\n this.timeoutDelete = this.setInterval(() => {\n this.library.garbageColleting('devices.', 2592000000, true);\n }, 3600000);\n }, 1000);\n }\n\n async handleMessage(topic: string, message: any): Promise {\n if (!topic || message == undefined) return;\n const topicA = topic.split('/');\n topicA.shift();\n const typ = topicA.shift();\n if (typ !== 'rooms' && typ !== 'settings' && typ !== 'devices') return;\n const temp = this.library.cloneGenericObject(statesObjects[typ]._channel) as ioBroker.DeviceObject;\n\n let device = topicA.shift();\n device = device ? device : 'no_name';\n if (message && typeof message.name && message.id) {\n this.namedDevices[message.id] = message.name;\n }\n temp.common.name = this.namedDevices[device] || device;\n\n await this.library.writedp(`${typ}.${device}`, undefined, temp);\n\n if (typ === 'rooms') {\n // ignore set commands\n if (topicA[topicA.length - 1] == 'set') return;\n\n const data: any = {};\n data[topicA.join('.')] = message;\n await this.library.writeFromJson(`${typ}.${device}`, typ, statesObjects, data);\n } else if (typ === 'settings') {\n const data: any = {};\n this.namedDevices[message.id] = message.name;\n\n /*const states = await this.library.getStates(`\\\\.${message.id}\\\\.`);\n for (const dp in states) {\n if (states[dp] !== undefined)\n this.library.setdb(\n dp,\n states[dp]!.type,\n states[dp]!.val,\n states[dp]!.stateTyp,\n states[dp]!.ack,\n states[dp]!.ts,\n states[dp]!.obj,\n true,\n );\n }*/\n\n data[topicA.join('.')] = message;\n await this.library.writeFromJson(`${typ}.${device}`, typ, statesObjects, data);\n if (typ === 'settings') this.log.debug(JSON.stringify(data));\n } else if (typ === 'devices') {\n let subDevice = topicA.shift();\n subDevice = subDevice ? subDevice : 'no_name';\n const temp = this.library.cloneGenericObject(statesObjects[typ]._channel) as ioBroker.DeviceObject;\n temp.common.name = this.namedDevices[subDevice] || subDevice;\n await this.library.writedp(`${typ}.${device}.${subDevice}`, undefined, temp);\n await this.library.writedp(`${typ}.${device}.presense`, true, genericStateObjects.presense);\n await this.library.writeFromJson(`${typ}.${device}.${subDevice}`, typ, statesObjects, message);\n }\n }\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n */\n private onUnload(callback: () => void): void {\n try {\n if (this.mqttClient) this.mqttClient.destroy();\n if (this.mqttServer) this.mqttServer.destroy();\n if (this.timeoutDelete) this.clearInterval(this.timeoutDelete);\n if (this.timeout) this.clearInterval(this.timeout);\n callback();\n } catch (e) {\n callback();\n }\n }\n\n // If you need to react to object changes, uncomment the following block and the corresponding line in the constructor.\n // You also need to subscribe to the objects with `this.subscribeObjects`, similar to `this.subscribeStates`.\n // /**\n // * Is called if a subscribed object changes\n // */\n // private onObjectChange(id: string, obj: ioBroker.Object | null | undefined): void {\n // if (obj) {\n // // The object was changed\n // this.log.info(`object ${id} changed: ${JSON.stringify(obj)}`);\n // } else {\n // // The object was deleted\n // this.log.info(`object ${id} deleted`);\n // }\n // }\n\n /**\n * Is called if a subscribed state changes\n */\n private async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise {\n if (state && !state.ack) {\n id = id.replace(`${this.namespace}.`, '');\n this.library.setdb(id, 'state', state.val, undefined, state.ack, state.ts);\n const dbEntry = this.library.readdp(id);\n if (dbEntry && dbEntry.obj && dbEntry.obj.common && dbEntry.obj.common.write) {\n const native = dbEntry.obj.native;\n let val = dbEntry.val;\n if (native && native.convert) {\n const fn = new Function('val', `return ${native.convert}`);\n val = fn(val);\n }\n const topic = `espresense/${id.split('.').join('/')}/set`;\n if (this.mqttClient) await this.mqttClient.publish(topic, String(val));\n }\n } else {\n }\n }\n\n // If you need to accept messages in your adapter, uncomment the following block and the corresponding line in the constructor.\n // /**\n // * Some message was sent to this instance over message box. Used by email, pushover, text2speech, ...\n // * Using this method requires \"common.messagebox\" property to be set to true in io-package.json\n // */\n // private onMessage(obj: ioBroker.Message): void {\n // if (typeof obj === 'object' && obj.message) {\n // if (obj.command === 'send') {\n // // e.g. send email or pushover or whatever\n // this.log.info('send command');\n\n // // Send response in callback if required\n // if (obj.callback) this.sendTo(obj.from, obj.command, 'Message received', obj.callback);\n // }\n // }\n // }\n}\n\nif (require.main !== module) {\n // Export the constructor in compact mode\n module.exports = (options: Partial | undefined) => new Espresense(options);\n} else {\n // otherwise start the instance directly\n (() => new Espresense())();\n}\n"], + "mappings": "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", "names": ["temp"] } diff --git a/src/lib/definition.ts b/src/lib/definition.ts index 6437bde..4ae92c4 100644 --- a/src/lib/definition.ts +++ b/src/lib/definition.ts @@ -36,7 +36,7 @@ export const genericStateObjects: { customString: ioBroker.StateObject; devices: ioBroker.FolderObject; rooms: ioBroker.FolderObject; - configs: ioBroker.FolderObject; + settings: ioBroker.FolderObject; presense: ioBroker.StateObject; } = { default: { @@ -79,7 +79,7 @@ export const genericStateObjects: { _id: '', type: 'folder', common: { - name: 'devises', + name: 'devices.folder', }, native: {}, }, @@ -87,15 +87,15 @@ export const genericStateObjects: { _id: '', type: 'folder', common: { - name: 'devises', + name: 'rooms.folder', }, native: {}, }, - configs: { + settings: { _id: '', type: 'folder', common: { - name: 'devises', + name: 'settings.folder', }, native: {}, }, @@ -130,7 +130,7 @@ export const statesObjects: statesObjectsType = { type: 'string', role: 'text', read: true, - write: true, + write: false, }, native: {}, }, @@ -142,7 +142,7 @@ export const statesObjects: statesObjectsType = { type: 'string', role: 'text', read: true, - write: true, + write: false, }, native: {}, }, @@ -154,7 +154,7 @@ export const statesObjects: statesObjectsType = { type: 'string', role: 'text', read: true, - write: true, + write: false, }, native: {}, }, @@ -253,7 +253,7 @@ export const statesObjects: statesObjectsType = { type: 'string', role: 'text', read: true, - write: true, + write: false, }, native: {}, }, @@ -267,7 +267,9 @@ export const statesObjects: statesObjectsType = { read: true, write: true, }, - native: {}, + native: { + convert: 'val ? "ON" : "OFF"', + }, }, auto_update: { _id: '', @@ -279,7 +281,9 @@ export const statesObjects: statesObjectsType = { read: true, write: true, }, - native: {}, + native: { + convert: 'val ? "ON" : "OFF"', + }, }, prerelease: { _id: '', @@ -291,7 +295,9 @@ export const statesObjects: statesObjectsType = { read: true, write: true, }, - native: {}, + native: { + convert: 'val ? "ON" : "OFF"', + }, }, motion: { _id: '', @@ -406,7 +412,7 @@ export const statesObjects: statesObjectsType = { _id: '', type: 'channel', common: { - name: 'room.channel', + name: 'room.led_1.channel', }, native: {}, }, @@ -418,7 +424,7 @@ export const statesObjects: statesObjectsType = { type: 'boolean', role: 'switch', read: true, - write: true, + write: false, }, native: {}, }, @@ -428,7 +434,7 @@ export const statesObjects: statesObjectsType = { _id: '', type: 'channel', common: { - name: 'room.channel', + name: 'room.telemetry.channel', }, native: {}, }, diff --git a/src/lib/library.ts b/src/lib/library.ts index 4db3ab8..901169d 100644 --- a/src/lib/library.ts +++ b/src/lib/library.ts @@ -12,6 +12,7 @@ type LibraryStateValJson = { val: ioBroker.StateValue | undefined; ts: number; ack: boolean; + obj: ioBroker.Object | undefined; init: boolean; }; @@ -227,7 +228,7 @@ export class Library extends BaseClass { if (typeof obj.common.name == 'string') obj.common.name = await this.getTranslationObj(obj.common.name); if (!del) await this.adapter.extendObjectAsync(dp, obj); const stateType = obj && obj.common && obj.common.type; - node = this.setdb(dp, obj.type, undefined, stateType, true); + node = this.setdb(dp, obj.type, undefined, stateType, true, Date.now(), obj); } else if (node.init && obj) { if (typeof obj.common.name == 'string') obj.common.name = await this.getTranslationObj(obj.common.name); if (!del) await this.adapter.extendObjectAsync(dp, obj); @@ -352,6 +353,7 @@ export class Library extends BaseClass { stateType: string | undefined, ack: boolean = true, ts: number = Date.now(), + obj: ioBroker.Object | undefined = undefined, init: boolean = false, ): LibraryStateVal { this.stateDataBase[dp] = { @@ -365,6 +367,12 @@ export class Library extends BaseClass { val: val, ack: ack, ts: ts ? ts : Date.now(), + obj: + obj !== undefined + ? obj + : this.stateDataBase[dp] !== undefined && this.stateDataBase[dp]!.obj !== undefined + ? this.stateDataBase[dp]!.obj + : undefined, init: init, }; return this.stateDataBase[dp]; @@ -415,6 +423,7 @@ export class Library extends BaseClass { obj && obj.common && obj.common.type ? obj.common.type : undefined, states[state] && states[state].ack, states[state] && states[state].ts ? states[state].ts : Date.now(), + obj == null ? undefined : obj, true, ); } else { diff --git a/src/lib/mqtt.ts b/src/lib/mqtt.ts index 95738e4..445ca26 100644 --- a/src/lib/mqtt.ts +++ b/src/lib/mqtt.ts @@ -73,6 +73,10 @@ export class MQTTClientClass extends BaseClass { this.adapter.handleMessage(topic, value); }); } + async publish(topic: string, message: string): Promise { + this.log.debug(`Publishing topic: ${topic} with message: ${message}.`); + await this.client.publishAsync(topic, message); + } destroy(): void { this.client.end(); diff --git a/src/main.ts b/src/main.ts index 52ea323..53629a3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -40,64 +40,65 @@ export class Espresense extends utils.Adapter { private async onReady(): Promise { // Reset the connection indicator during startup this.setStateAsync('info.connection', false, true); - - await this.library.init(); - await this.library.initStates(await this.getStatesAsync('*')); - this.library.defaults.updateStateOnChangeOnly = false; - - this.library.writedp('devices', undefined, genericStateObjects.devices); - this.library.writedp('rooms', undefined, genericStateObjects.rooms); - this.library.writedp('settings', undefined, genericStateObjects.configs); - - this.namedDevices = {}; - //check config - let testIt: any = this.config.MQTTServerIp; - if (testIt == '' || typeof testIt != 'string') { - this.log.warn(`Invalid configuration mqtt server ip has unexpeted value: ${testIt}`); - return; - } - testIt = this.config.MQTTServerPort; - if (typeof testIt != 'number' || testIt <= 1023) { - this.log.warn(`Invalid configuration mqtt server port has unexpeted value: ${testIt}`); - return; - } - testIt = this.config.MQTTPassword; - if (typeof testIt != 'string') { - this.log.error(`Invalid configuration mqtt server password has unexpeted value type ${typeof testIt}`); - return; - } - testIt = this.config.MQTTUsername; - if (typeof testIt != 'string') { - this.log.error(`Invalid configuration mqtt username has unexpeted value typ: ${typeof testIt}`); - return; - } - testIt = this.config.unseenTime; - if (isNaN(testIt) || testIt == '' || testIt < 5) { - this.config.unseenTime = 20; - } - this.config.unseenTime *= 1000; - // configuration ok - if (this.config.MQTTUseServer) { - this.mqttServer = new MQTTServerClass( + setTimeout(async () => { + await this.library.init(); + await this.library.initStates(await this.getStatesAsync('*')); + this.library.defaults.updateStateOnChangeOnly = false; + + this.library.writedp('devices', undefined, genericStateObjects.devices); + this.library.writedp('rooms', undefined, genericStateObjects.rooms); + this.library.writedp('settings', undefined, genericStateObjects.settings); + await this.subscribeStatesAsync('rooms.*'); + this.namedDevices = {}; + //check config + let testIt: any = this.config.MQTTServerIp; + if (testIt == '' || typeof testIt != 'string') { + this.log.warn(`Invalid configuration mqtt server ip has unexpeted value: ${testIt}`); + return; + } + testIt = this.config.MQTTServerPort; + if (typeof testIt != 'number' || testIt <= 1023) { + this.log.warn(`Invalid configuration mqtt server port has unexpeted value: ${testIt}`); + return; + } + testIt = this.config.MQTTPassword; + if (typeof testIt != 'string') { + this.log.error(`Invalid configuration mqtt server password has unexpeted value type ${typeof testIt}`); + return; + } + testIt = this.config.MQTTUsername; + if (typeof testIt != 'string') { + this.log.error(`Invalid configuration mqtt username has unexpeted value typ: ${typeof testIt}`); + return; + } + testIt = this.config.unseenTime; + if (isNaN(testIt) || testIt == '' || testIt < 5) { + this.config.unseenTime = 20; + } + this.config.unseenTime *= 1000; + // configuration ok + if (this.config.MQTTUseServer) { + this.mqttServer = new MQTTServerClass( + this, + this.config.MQTTServerPort, + this.config.MQTTUsername, + this.config.MQTTPassword, + ); + } + this.mqttClient = new MQTTClientClass( this, + this.config.MQTTUseServer ? '127.0.0.1' : this.config.MQTTServerIp, this.config.MQTTServerPort, this.config.MQTTUsername, this.config.MQTTPassword, ); - } - this.mqttClient = new MQTTClientClass( - this, - this.config.MQTTUseServer ? '127.0.0.1' : this.config.MQTTServerIp, - this.config.MQTTServerPort, - this.config.MQTTUsername, - this.config.MQTTPassword, - ); - this.timeout = this.setInterval(() => { - this.library.garbageColleting('devices.', this.config.unseenTime); - }, this.unseenCheckTime); - this.timeoutDelete = this.setInterval(() => { - this.library.garbageColleting('devices.', 2592000000, true); - }, 3600000); + this.timeout = this.setInterval(() => { + this.library.garbageColleting('devices.', this.config.unseenTime); + }, this.unseenCheckTime); + this.timeoutDelete = this.setInterval(() => { + this.library.garbageColleting('devices.', 2592000000, true); + }, 3600000); + }, 1000); } async handleMessage(topic: string, message: any): Promise { @@ -118,6 +119,9 @@ export class Espresense extends utils.Adapter { await this.library.writedp(`${typ}.${device}`, undefined, temp); if (typ === 'rooms') { + // ignore set commands + if (topicA[topicA.length - 1] == 'set') return; + const data: any = {}; data[topicA.join('.')] = message; await this.library.writeFromJson(`${typ}.${device}`, typ, statesObjects, data); @@ -125,7 +129,7 @@ export class Espresense extends utils.Adapter { const data: any = {}; this.namedDevices[message.id] = message.name; - const states = await this.library.getStates(`\\.${message.id}\\.`); + /*const states = await this.library.getStates(`\\.${message.id}\\.`); for (const dp in states) { if (states[dp] !== undefined) this.library.setdb( @@ -135,9 +139,10 @@ export class Espresense extends utils.Adapter { states[dp]!.stateTyp, states[dp]!.ack, states[dp]!.ts, + states[dp]!.obj, true, ); - } + }*/ data[topicA.join('.')] = message; await this.library.writeFromJson(`${typ}.${device}`, typ, statesObjects, data); @@ -185,13 +190,22 @@ export class Espresense extends utils.Adapter { /** * Is called if a subscribed state changes */ - private onStateChange(id: string, state: ioBroker.State | null | undefined): void { - if (state) { - // The state was changed - this.log.info(`state ${id} changed: ${state.val} (ack = ${state.ack})`); + private async onStateChange(id: string, state: ioBroker.State | null | undefined): Promise { + if (state && !state.ack) { + id = id.replace(`${this.namespace}.`, ''); + this.library.setdb(id, 'state', state.val, undefined, state.ack, state.ts); + const dbEntry = this.library.readdp(id); + if (dbEntry && dbEntry.obj && dbEntry.obj.common && dbEntry.obj.common.write) { + const native = dbEntry.obj.native; + let val = dbEntry.val; + if (native && native.convert) { + const fn = new Function('val', `return ${native.convert}`); + val = fn(val); + } + const topic = `espresense/${id.split('.').join('/')}/set`; + if (this.mqttClient) await this.mqttClient.publish(topic, String(val)); + } } else { - // The state was deleted - this.log.info(`state ${id} deleted`); } }