iobroker.solarviewdatareader 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019-2025 Achim Fürhoff <achim.fuerhoff@outlook.de>
3
+ Copyright (c) 2019-2026 Achim Fürhoff <achim.fuerhoff@outlook.de>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -60,6 +60,17 @@ UL3, IL3 = mains voltage, mains power phase 3
60
60
  TKK= Temperature inverter
61
61
 
62
62
  ## Changelog
63
+ ### 1.2.5 (2026-05-16)
64
+ * (copilot) Adapter requires node.js >= 22 now
65
+ * (afuerhoff) dependencies updated
66
+ * (afuerhoff) dependabot.yml fixed [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)
67
+ * (afuerhoff) license information updated
68
+
69
+ ### 1.2.4 (2025-10-24)
70
+ * (afuerhoff) dependencies updated
71
+ * (afuerhoff) npm security changes
72
+ * (afuerhoff) repository checker warnings fixed
73
+
63
74
  ### 1.2.3 (2025-09-19)
64
75
  * (afuerhoff) dependencies updated
65
76
  * (afuerhoff) repository checker issues fixed
@@ -73,22 +84,10 @@ TKK= Temperature inverter
73
84
  ### 1.2.1 (2025-02-26)
74
85
  * (afuerhoff) dependencies updated
75
86
 
76
- ### 1.2.0 (2024-12-20)
77
- * (afuerhoff) dependencies updated
78
- * (afuerhoff) Migration to ESLint 9 and @iobroker/eslint-config - issue [#189]
79
- * (afuerhoff) eslint: code optimized
80
- * (afuerhoff) fixing chksum message if inverter 2 - 4 is not available
81
- * (afuerhoff) logging optimized
82
- * (afuerhoff) net handling optimized
83
-
84
- ### 1.1.4 (2024-10-17)
85
- * (afuerhoff) dependencies updated
86
- * (afuerhoff) Fixes [#182](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/182)
87
-
88
- ## License
87
+ [Older changelogs can be found there](CHANGELOG_OLD.md)## License
89
88
  MIT License
90
89
 
91
- Copyright (c) 2019-2025 Achim Fürhoff <achim.fuerhoff@outlook.de>
90
+ Copyright (c) 2019-2026 Achim Fürhoff <achim.fuerhoff@outlook.de>
92
91
 
93
92
  Permission is hereby granted, free of charge, to any person obtaining a copy
94
93
  of this software and associated documentation files (the "Software"), to deal
package/build/main.js CHANGED
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
  var utils = __toESM(require("@iobroker/adapter-core"));
25
- var net = __toESM(require("net"));
25
+ var net = __toESM(require("node:net"));
26
26
  class Solarviewdatareader extends utils.Adapter {
27
27
  tout;
28
28
  jobSchedule;
package/build/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["'use strict';\n/*\n * Created with @iobroker/create-adapter v1.14.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\nimport * as utils from '@iobroker/adapter-core';\n\n// Load your modules here, e.g.:\nimport * as net from 'net';\n\ninterface IChecksumResult {\n result: boolean;\n chksum: number;\n ind: number;\n data: Buffer;\n}\n\nclass Solarviewdatareader extends utils.Adapter {\n private tout!: NodeJS.Timeout;\n private jobSchedule!: NodeJS.Timeout;\n private chkCnt: number;\n private conn!: net.Socket;\n private lastCommand: string;\n private commandQueue: string[];\n private isProcessingQueue: boolean;\n private isProcessingCmd: boolean;\n private isError: boolean;\n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: 'solarviewdatareader',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('unload', this.onUnload.bind(this));\n this.lastCommand = '';\n this.commandQueue = [];\n this.isProcessingQueue = false;\n this.isProcessingCmd = false;\n this.chkCnt = 0;\n this.isError = false;\n }\n\n private async createObject(id: string, obj: ioBroker.SettableObject): Promise<void> {\n await this.setObjectNotExistsAsync(id, obj);\n await this.extendObject(id, obj);\n\n const currentState = await this.getStateAsync(id);\n const stCommon: ioBroker.StateCommon = obj.common as ioBroker.StateCommon; // Type Assertion\n if (currentState === null && stCommon.def !== undefined) {\n await this.setState(id, stCommon.def, true); // set default\n }\n }\n\n private async createGlobalObjects(): Promise<void> {\n const options: [string, ioBroker.SettableObject][] = [\n [\n 'info.connection',\n {\n type: 'state',\n common: {\n name: 'connection',\n type: 'boolean',\n role: 'indicator.connected',\n def: false,\n read: true,\n write: false,\n desc: 'Solarview connection state',\n unit: '',\n },\n native: {},\n },\n ],\n [\n 'info.lastUpdate',\n {\n type: 'state',\n common: {\n name: 'lastUpdate',\n type: 'string',\n role: 'date',\n def: new Date('1900-01-01T00:00:00').toString(),\n read: true,\n write: false,\n desc: 'Last connection date/time',\n unit: '',\n },\n native: {},\n },\n ],\n ];\n\n for (const option of options) {\n await this.createObject(...option);\n }\n }\n\n private async createSolarviewObjects(device: string, additional: boolean = false): Promise<void> {\n let options: [string, ioBroker.SettableObject][] = [\n [device, { type: 'channel', common: { name: device }, native: {} }],\n [\n `${device}.current`,\n {\n type: 'state',\n common: {\n name: 'current',\n type: 'number',\n role: 'value.power',\n def: 0,\n read: true,\n write: false,\n desc: 'Current PAC',\n unit: 'W',\n },\n native: {},\n },\n ],\n [\n `${device}.daily`,\n {\n type: 'state',\n common: {\n name: 'daily',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Daily yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n [\n `${device}.monthly`,\n {\n type: 'state',\n common: {\n name: 'monthly',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Monthly yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n [\n `${device}.yearly`,\n {\n type: 'state',\n common: {\n name: 'yearly',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Yearly yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n [\n `${device}.total`,\n {\n type: 'state',\n common: {\n name: 'total',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Total yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n ];\n\n if (additional) {\n const additionalOptions: [string, ioBroker.SettableObject][] = [\n [\n `${device}.udc`,\n {\n type: 'state',\n common: {\n name: 'udc',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idc`,\n {\n type: 'state',\n common: {\n name: 'idc',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.udcb`,\n {\n type: 'state',\n common: {\n name: 'udcb',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idcb`,\n {\n type: 'state',\n common: {\n name: 'idcb',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.udcc`,\n {\n type: 'state',\n common: {\n name: 'udcc',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idcc`,\n {\n type: 'state',\n common: {\n name: 'idcc',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.udcd`,\n {\n type: 'state',\n common: {\n name: 'udcd',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idcd`,\n {\n type: 'state',\n common: {\n name: 'idcd',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.ul1`,\n {\n type: 'state',\n common: {\n name: 'ul1',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.il1`,\n {\n type: 'state',\n common: {\n name: 'il1',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.ul2`,\n {\n type: 'state',\n common: {\n name: 'ul2',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.il2`,\n {\n type: 'state',\n common: {\n name: 'il2',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.ul3`,\n {\n type: 'state',\n common: {\n name: 'ul3',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.il3`,\n {\n type: 'state',\n common: {\n name: 'il3',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.tkk`,\n {\n type: 'state',\n common: {\n name: 'tkk',\n type: 'number',\n role: 'value.temperature',\n def: 0,\n read: true,\n write: false,\n desc: 'Temperature',\n unit: '\u00B0C',\n },\n native: {},\n },\n ],\n ];\n options = options.concat(additionalOptions);\n }\n\n for (const option of options) {\n await this.createObject(...option);\n }\n }\n\n //for compatibility reasons. Minute interval changed to seconds.\n private async adjustIntervalToSeconds(): Promise<void> {\n const adapterObj: ioBroker.Object | null | undefined = await this.getForeignObjectAsync(\n `system.adapter.${this.namespace}`,\n );\n if (!this.config.interval_seconds) {\n if (adapterObj) {\n adapterObj.native.interval_seconds = true;\n adapterObj.native.intervalVal *= 60;\n this.log.warn('Interval changed to seconds!');\n this.log.info('Interval attribute changed! Please check the configuration');\n this.log.info('Adapter restarts');\n }\n }\n }\n\n // Nullen voranstellen - add Leading Zero\n private aLZ(n: number): string {\n return n <= 9 ? `0${n}` : n.toString();\n }\n\n private calcChecksum(inputString: string): IChecksumResult {\n const buffer = Buffer.from(inputString);\n let sum = 0;\n let index = 0;\n\n for (let i = 0; i < buffer.length; i++) {\n sum = (sum + buffer[i]) % 128;\n if (buffer[i] === 125) {\n index = i + 2;\n break;\n }\n }\n\n const result: IChecksumResult = {\n result: buffer[index] === sum,\n chksum: sum,\n ind: index,\n data: buffer,\n };\n\n return result;\n }\n\n private preprocessSolarviewData(response: Buffer): string[] {\n let sv_data = response.toString('ascii');\n sv_data = sv_data.replace(/[{}]+/g, ''); // Remove \"{}\"\n return sv_data.split(',');\n }\n\n private getSolarviewPrefix(dataCode: string): string {\n const prefixMap: { [key: string]: string } = {\n '00': 'pvig.',\n '01': 'pvi1.',\n '02': 'pvi2.',\n '03': 'pvi3.',\n '04': 'pvi4.',\n 10: 'scm0.',\n 11: 'scm1.',\n 12: 'scm2.',\n 13: 'scm3.',\n 14: 'scm4.',\n 21: 'd0supply.',\n 22: 'd0consumption.',\n };\n return prefixMap[dataCode] || '';\n }\n\n private async updateSolarviewStates(sv_data: string[], sv_prefix: string): Promise<void> {\n try {\n this.updateState(`${sv_prefix}current`, sv_data, 10);\n if (sv_prefix === 'pvig.') {\n await this.handleCCUUpdate(sv_data);\n }\n this.updateState(`${sv_prefix}daily`, sv_data, 6);\n this.updateState(`${sv_prefix}monthly`, sv_data, 7);\n this.updateState(`${sv_prefix}yearly`, sv_data, 8);\n this.updateState(`${sv_prefix}total`, sv_data, 9);\n\n if (sv_data.length >= 23) {\n this.updateExtendedStates(sv_data, sv_prefix);\n }\n } catch (error: unknown) {\n this.errorHandler(`updateSolarviewStates`, error);\n throw error;\n }\n }\n\n private async handleCCUUpdate(sv_data: string[]): Promise<void> {\n try {\n if (this.config.setCCU) {\n const obj = await this.findForeignObjectAsync(this.config.CCUSystemV, null);\n if (obj && obj.name) {\n this.log.debug(`set CCU system variable: ${this.config.CCUSystemV}`);\n this.setForeignState(this.config.CCUSystemV, { val: Number(sv_data[10]), ack: false });\n } else {\n this.log.error(`CCU system variable ${this.config.CCUSystemV} does not exist!`);\n }\n }\n } catch (error: unknown) {\n this.errorHandler(`handleCCUUpdate`, error);\n throw error;\n }\n }\n\n private updateExtendedStates(sv_data: string[], sv_prefix: string): void {\n this.updateState(`${sv_prefix}udc`, sv_data, 11);\n this.updateState(`${sv_prefix}idc`, sv_data, 12);\n this.updateState(`${sv_prefix}udcb`, sv_data, 13);\n this.updateState(`${sv_prefix}idcb`, sv_data, 14);\n this.updateState(`${sv_prefix}udcc`, sv_data, 15);\n this.updateState(`${sv_prefix}idcc`, sv_data, 16);\n this.updateState(`${sv_prefix}udcd`, sv_data, 17);\n this.updateState(`${sv_prefix}idcd`, sv_data, 18);\n\n if (sv_data.length === 27) {\n // Neue Version Solarview\n this.updateState(`${sv_prefix}ul1`, sv_data, 19);\n this.updateState(`${sv_prefix}il1`, sv_data, 20);\n this.updateState(`${sv_prefix}ul2`, sv_data, 21);\n this.updateState(`${sv_prefix}il2`, sv_data, 22);\n this.updateState(`${sv_prefix}ul3`, sv_data, 23);\n this.updateState(`${sv_prefix}il3`, sv_data, 24);\n this.updateState(`${sv_prefix}tkk`, sv_data, 25);\n } else if (sv_data.length === 23) {\n // Alte Version Solarview\n this.updateState(`${sv_prefix}ul1`, sv_data, 19);\n this.updateState(`${sv_prefix}il1`, sv_data, 20);\n this.updateState(`${sv_prefix}tkk`, sv_data, 21);\n }\n }\n\n private updateState(stateName: string, sv_data: string[], index: number): void {\n const value = Number(sv_data[index]);\n this.setStateChanged(stateName, { val: value, ack: true });\n }\n\n private async onReady(): Promise<void> {\n try {\n const starttime = this.config.intervalstart.split(':').slice(0, 2).join(':');\n const endtime = this.config.intervalend.split(':').slice(0, 2).join(':');\n\n this.log.info(\n `start solarview ${this.config.ipaddress}:${this.config.port} - polling interval: ${this.config.intervalVal}s (${starttime} to ${\n endtime\n })`,\n );\n this.log.info(`d0 converter: ${this.config.d0converter.toString()}`);\n\n await this.createGlobalObjects();\n\n await this.createSolarviewObjects('pvig', false);\n if (this.config.d0converter) {\n await this.createSolarviewObjects('d0supply', false);\n }\n if (this.config.d0converter) {\n await this.createSolarviewObjects('d0consumption', false);\n }\n if (this.config.scm0) {\n await this.createSolarviewObjects('scm0', false);\n }\n if (this.config.scm1) {\n await this.createSolarviewObjects('scm1', false);\n }\n if (this.config.scm2) {\n await this.createSolarviewObjects('scm2', false);\n }\n if (this.config.scm3) {\n await this.createSolarviewObjects('scm3', false);\n }\n if (this.config.scm4) {\n await this.createSolarviewObjects('scm4', false);\n }\n if (this.config.pvi1) {\n await this.createSolarviewObjects('pvi1', true);\n }\n if (this.config.pvi2) {\n await this.createSolarviewObjects('pvi2', true);\n }\n if (this.config.pvi3) {\n await this.createSolarviewObjects('pvi3', true);\n }\n if (this.config.pvi4) {\n await this.createSolarviewObjects('pvi4', true);\n }\n\n if (!this.config.interval_seconds) {\n await this.adjustIntervalToSeconds.call(this);\n }\n\n this.conn = new net.Socket();\n this.conn.setTimeout(2000);\n this.conn.on('data', this.onDataHandler.bind(this));\n this.conn.on('close', this.onCloseHandler.bind(this));\n this.conn.on('error', this.onErrorHandler.bind(this));\n this.conn.on('timeout', this.onTimeoutHandler.bind(this));\n\n //First start\n await this.setCmdQueue();\n\n this.jobSchedule = setInterval(async () => {\n try {\n await this.setCmdQueue();\n } catch (error: any) {\n this.log.error(`onReady.schedule: ${error.message}`);\n }\n }, this.config.intervalVal * 1000);\n } catch (error: unknown) {\n this.errorHandler(`onReady`, error);\n }\n }\n\n private onTimeoutHandler(): void {\n this.log.error('onTimeoutHandler: socket timeout');\n this.conn.end();\n }\n\n private async onDataHandler(data: any): Promise<void> {\n try {\n await this.processData(data);\n this.conn.end();\n } catch (error: unknown) {\n this.errorHandler(`conn.on data`, error);\n }\n }\n\n private processData = async (data: Buffer): Promise<void> => {\n try {\n const strdata: string[] = this.preprocessSolarviewData(data);\n const id = this.getSolarviewPrefix(strdata[0]);\n const cs: IChecksumResult = this.calcChecksum(data.toString('ascii'));\n if (cs.result) {\n await this.handleChecksumSuccess(strdata, id, data);\n } else {\n this.handleChecksumFailure(strdata, cs);\n }\n } catch (error: unknown) {\n this.errorHandler(`processData`, error);\n throw error;\n }\n };\n\n private async handleChecksumSuccess(sv_data: string[], sv_prefix: string, response: Buffer): Promise<void> {\n try {\n this.chkCnt = 0;\n this.log.debug(`${response.toString('ascii')}`);\n\n await this.updateSolarviewStates(sv_data, sv_prefix);\n\n const sDate = `${sv_data[3]}-${this.aLZ(parseInt(sv_data[2]))}-${this.aLZ(parseInt(sv_data[1]))} ${this.aLZ(parseInt(sv_data[4]))}:${this.aLZ(parseInt(sv_data[5]))}`;\n this.setStateChanged('info.lastUpdate', { val: sDate, ack: true });\n this.setStateChanged('info.connection', { val: true, ack: true });\n } catch (error: unknown) {\n this.errorHandler(`handleChecksumSuccess`, error);\n throw error;\n }\n }\n\n private handleChecksumFailure(sv_data: string[], csum: IChecksumResult): void {\n if (csum.chksum !== 0) {\n if (csum.data.toString('ascii') != ';-)\\n') {\n this.chkCnt += 1;\n this.log.warn(`checksum not correct! ${sv_data[0]}: ${csum.data.toString('ascii')}`);\n } else {\n //else -> option not supported from Solarview due to missing Inverter -> chksum ;-)\\n\n this.log.warn(`command ${this.lastCommand} not supported!`);\n }\n }\n }\n\n private async onCloseHandler(): Promise<void> {\n try {\n if (this.lastCommand) {\n this.log.debug(`Connection closed after executing command: ${this.lastCommand}`);\n } else {\n this.log.debug('Connection closed');\n }\n this.isProcessingCmd = false;\n if (this.chkCnt > 3) {\n await this.setState('info.connection', false, true);\n this.log.warn('Solarview Server is not reachable');\n this.chkCnt = 0;\n }\n } catch (error: unknown) {\n this.errorHandler(`conn.on close`, error);\n }\n }\n\n private onErrorHandler(error: unknown): void {\n this.errorHandler(`conn.on error - cmd: ${this.lastCommand}`, error);\n }\n\n private _sleep(milliseconds: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n }\n\n private connectAsync = (port: number, ip_address: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n this.conn.connect(port, ip_address, () => {\n resolve();\n });\n this.conn.on('error', err => {\n reject(err);\n });\n });\n };\n\n private async setCmdQueue(): Promise<void> {\n try {\n const commands: string[] = [];\n const { d0converter, scm0, scm1, scm2, scm3, scm4, pvi1, pvi2, pvi3, pvi4, intervalstart, intervalend } =\n this.config;\n\n const starttime = intervalstart.split(':').slice(0, 2).join(':');\n let endtime = intervalend.split(':').slice(0, 2).join(':');\n endtime = endtime === '00:00' ? '23:59' : endtime;\n\n const dnow = new Date();\n const dstart = new Date(`${dnow.getFullYear()}-${dnow.getMonth() + 1}-${dnow.getDate()} ${starttime}`);\n const dend = new Date(`${dnow.getFullYear()}-${dnow.getMonth() + 1}-${dnow.getDate()} ${endtime}`);\n\n if (dnow >= dstart && dnow <= dend) {\n commands.push('00*'); // pvig\n if (d0converter) {\n commands.push('21*');\n }\n if (pvi1) {\n commands.push('01*');\n }\n if (pvi2) {\n commands.push('02*');\n }\n if (pvi3) {\n commands.push('03*');\n }\n if (pvi4) {\n commands.push('04*');\n }\n }\n\n if (d0converter) {\n commands.push('22*');\n }\n if (scm0) {\n commands.push('10*');\n }\n if (scm1) {\n commands.push('11*');\n }\n if (scm2) {\n commands.push('12*');\n }\n if (scm3) {\n commands.push('13*');\n }\n if (scm4) {\n commands.push('14*');\n }\n\n // Befehle zur Warteschlange hinzuf\u00FCgen\n this.commandQueue.push(...commands);\n\n // Verarbeite die Warteschlange\n await this.processQueue();\n } catch (error: unknown) {\n this.errorHandler(`setCmdQueue`, error);\n }\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessingQueue) {\n this.log.warn(`processQueue: command queue not empty! Waiting for solarview server ...`);\n return;\n }\n this.isProcessingQueue = true;\n\n while (this.commandQueue.length > 0) {\n if (!this.isProcessingCmd) {\n const cmd = this.commandQueue.shift();\n if (cmd) {\n try {\n this.isProcessingCmd = true;\n await this.executeCommand(cmd);\n if (this.isError === true) {\n this.log.info('Server connection is now working again!');\n this.isError = false;\n }\n } catch {\n this.isError = true;\n this.commandQueue.length = 0; // Queue l\u00F6schen\n this.isProcessingQueue = false;\n this.isProcessingCmd = false;\n }\n }\n }\n await this._sleep(500);\n }\n this.isProcessingQueue = false;\n }\n\n private async executeCommand(cmd: string): Promise<void> {\n this.log.debug(`Attempting to execute command: ${cmd}`);\n this.lastCommand = cmd;\n await this.connectAsync(this.config.port, this.config.ipaddress);\n this.conn.write(cmd);\n this.log.debug(`Command successfully sent: ${cmd}`);\n }\n\n private onUnload(callback: () => void): void {\n try {\n clearInterval(this.jobSchedule);\n clearTimeout(this.tout);\n this.conn.destroy();\n this.setStateChanged('info.connection', { val: false, ack: true });\n this.log.info('cleaned everything up...');\n callback();\n } catch (error: unknown) {\n this.errorHandler('onUnload', error);\n callback();\n }\n }\n\n private errorHandler(errTitle: string, error: unknown): void {\n if (error instanceof Error) {\n if (error.message.includes('EHOSTUNREACH') || error.message.includes('ECONNREFUSED')) {\n this.log.warn(`${errTitle}: Solarview server is not reachable! Please check the server.`);\n } else {\n this.log.error(`${errTitle}: ${error.message}\\nStacktrace: ${error.stack}`);\n }\n } else if (typeof error === 'string') {\n this.log.error(`${errTitle}: ${error}`);\n } else {\n this.log.error(`${errTitle}: Unknown error occurred: {error}`);\n }\n }\n}\n\nif (require.main !== module) {\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) => new Solarviewdatareader(options);\n} else {\n (() => new Solarviewdatareader())();\n}\n"],
4
+ "sourcesContent": ["'use strict';\n/*\n * Created with @iobroker/create-adapter v1.14.0\n */\n\n// The adapter-core module gives you access to the core ioBroker functions\nimport * as utils from '@iobroker/adapter-core';\n\n// Load your modules here, e.g.:\nimport * as net from 'node:net';\n\ninterface IChecksumResult {\n result: boolean;\n chksum: number;\n ind: number;\n data: Buffer;\n}\n\nclass Solarviewdatareader extends utils.Adapter {\n private tout!: NodeJS.Timeout;\n private jobSchedule!: NodeJS.Timeout;\n private chkCnt: number;\n private conn!: net.Socket;\n private lastCommand: string;\n private commandQueue: string[];\n private isProcessingQueue: boolean;\n private isProcessingCmd: boolean;\n private isError: boolean;\n\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\n super({\n ...options,\n name: 'solarviewdatareader',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('unload', this.onUnload.bind(this));\n this.lastCommand = '';\n this.commandQueue = [];\n this.isProcessingQueue = false;\n this.isProcessingCmd = false;\n this.chkCnt = 0;\n this.isError = false;\n }\n\n private async createObject(id: string, obj: ioBroker.SettableObject): Promise<void> {\n await this.setObjectNotExistsAsync(id, obj);\n await this.extendObject(id, obj);\n\n const currentState = await this.getStateAsync(id);\n const stCommon: ioBroker.StateCommon = obj.common as ioBroker.StateCommon; // Type Assertion\n if (currentState === null && stCommon.def !== undefined) {\n await this.setState(id, stCommon.def, true); // set default\n }\n }\n\n private async createGlobalObjects(): Promise<void> {\n const options: [string, ioBroker.SettableObject][] = [\n [\n 'info.connection',\n {\n type: 'state',\n common: {\n name: 'connection',\n type: 'boolean',\n role: 'indicator.connected',\n def: false,\n read: true,\n write: false,\n desc: 'Solarview connection state',\n unit: '',\n },\n native: {},\n },\n ],\n [\n 'info.lastUpdate',\n {\n type: 'state',\n common: {\n name: 'lastUpdate',\n type: 'string',\n role: 'date',\n def: new Date('1900-01-01T00:00:00').toString(),\n read: true,\n write: false,\n desc: 'Last connection date/time',\n unit: '',\n },\n native: {},\n },\n ],\n ];\n\n for (const option of options) {\n await this.createObject(...option);\n }\n }\n\n private async createSolarviewObjects(device: string, additional: boolean = false): Promise<void> {\n let options: [string, ioBroker.SettableObject][] = [\n [device, { type: 'channel', common: { name: device }, native: {} }],\n [\n `${device}.current`,\n {\n type: 'state',\n common: {\n name: 'current',\n type: 'number',\n role: 'value.power',\n def: 0,\n read: true,\n write: false,\n desc: 'Current PAC',\n unit: 'W',\n },\n native: {},\n },\n ],\n [\n `${device}.daily`,\n {\n type: 'state',\n common: {\n name: 'daily',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Daily yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n [\n `${device}.monthly`,\n {\n type: 'state',\n common: {\n name: 'monthly',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Monthly yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n [\n `${device}.yearly`,\n {\n type: 'state',\n common: {\n name: 'yearly',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Yearly yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n [\n `${device}.total`,\n {\n type: 'state',\n common: {\n name: 'total',\n type: 'number',\n role: 'value.energy',\n def: 0,\n read: true,\n write: false,\n desc: 'Total yield',\n unit: 'kWh',\n },\n native: {},\n },\n ],\n ];\n\n if (additional) {\n const additionalOptions: [string, ioBroker.SettableObject][] = [\n [\n `${device}.udc`,\n {\n type: 'state',\n common: {\n name: 'udc',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idc`,\n {\n type: 'state',\n common: {\n name: 'idc',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.udcb`,\n {\n type: 'state',\n common: {\n name: 'udcb',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idcb`,\n {\n type: 'state',\n common: {\n name: 'idcb',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.udcc`,\n {\n type: 'state',\n common: {\n name: 'udcc',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idcc`,\n {\n type: 'state',\n common: {\n name: 'idcc',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.udcd`,\n {\n type: 'state',\n common: {\n name: 'udcd',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.idcd`,\n {\n type: 'state',\n common: {\n name: 'idcd',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Generator current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.ul1`,\n {\n type: 'state',\n common: {\n name: 'ul1',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.il1`,\n {\n type: 'state',\n common: {\n name: 'il1',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.ul2`,\n {\n type: 'state',\n common: {\n name: 'ul2',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.il2`,\n {\n type: 'state',\n common: {\n name: 'il2',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.ul3`,\n {\n type: 'state',\n common: {\n name: 'ul3',\n type: 'number',\n role: 'value.voltage',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains voltage',\n unit: 'V',\n },\n native: {},\n },\n ],\n [\n `${device}.il3`,\n {\n type: 'state',\n common: {\n name: 'il3',\n type: 'number',\n role: 'value.current',\n def: 0,\n read: true,\n write: false,\n desc: 'Mains current',\n unit: 'A',\n },\n native: {},\n },\n ],\n [\n `${device}.tkk`,\n {\n type: 'state',\n common: {\n name: 'tkk',\n type: 'number',\n role: 'value.temperature',\n def: 0,\n read: true,\n write: false,\n desc: 'Temperature',\n unit: '\u00B0C',\n },\n native: {},\n },\n ],\n ];\n options = options.concat(additionalOptions);\n }\n\n for (const option of options) {\n await this.createObject(...option);\n }\n }\n\n //for compatibility reasons. Minute interval changed to seconds.\n private async adjustIntervalToSeconds(): Promise<void> {\n const adapterObj: ioBroker.Object | null | undefined = await this.getForeignObjectAsync(\n `system.adapter.${this.namespace}`,\n );\n if (!this.config.interval_seconds) {\n if (adapterObj) {\n adapterObj.native.interval_seconds = true;\n adapterObj.native.intervalVal *= 60;\n this.log.warn('Interval changed to seconds!');\n this.log.info('Interval attribute changed! Please check the configuration');\n this.log.info('Adapter restarts');\n }\n }\n }\n\n // Nullen voranstellen - add Leading Zero\n private aLZ(n: number): string {\n return n <= 9 ? `0${n}` : n.toString();\n }\n\n private calcChecksum(inputString: string): IChecksumResult {\n const buffer = Buffer.from(inputString);\n let sum = 0;\n let index = 0;\n\n for (let i = 0; i < buffer.length; i++) {\n sum = (sum + buffer[i]) % 128;\n if (buffer[i] === 125) {\n index = i + 2;\n break;\n }\n }\n\n const result: IChecksumResult = {\n result: buffer[index] === sum,\n chksum: sum,\n ind: index,\n data: buffer,\n };\n\n return result;\n }\n\n private preprocessSolarviewData(response: Buffer): string[] {\n let sv_data = response.toString('ascii');\n sv_data = sv_data.replace(/[{}]+/g, ''); // Remove \"{}\"\n return sv_data.split(',');\n }\n\n private getSolarviewPrefix(dataCode: string): string {\n const prefixMap: { [key: string]: string } = {\n '00': 'pvig.',\n '01': 'pvi1.',\n '02': 'pvi2.',\n '03': 'pvi3.',\n '04': 'pvi4.',\n 10: 'scm0.',\n 11: 'scm1.',\n 12: 'scm2.',\n 13: 'scm3.',\n 14: 'scm4.',\n 21: 'd0supply.',\n 22: 'd0consumption.',\n };\n return prefixMap[dataCode] || '';\n }\n\n private async updateSolarviewStates(sv_data: string[], sv_prefix: string): Promise<void> {\n try {\n this.updateState(`${sv_prefix}current`, sv_data, 10);\n if (sv_prefix === 'pvig.') {\n await this.handleCCUUpdate(sv_data);\n }\n this.updateState(`${sv_prefix}daily`, sv_data, 6);\n this.updateState(`${sv_prefix}monthly`, sv_data, 7);\n this.updateState(`${sv_prefix}yearly`, sv_data, 8);\n this.updateState(`${sv_prefix}total`, sv_data, 9);\n\n if (sv_data.length >= 23) {\n this.updateExtendedStates(sv_data, sv_prefix);\n }\n } catch (error: unknown) {\n this.errorHandler(`updateSolarviewStates`, error);\n throw error;\n }\n }\n\n private async handleCCUUpdate(sv_data: string[]): Promise<void> {\n try {\n if (this.config.setCCU) {\n const obj = await this.findForeignObjectAsync(this.config.CCUSystemV, null);\n if (obj && obj.name) {\n this.log.debug(`set CCU system variable: ${this.config.CCUSystemV}`);\n this.setForeignState(this.config.CCUSystemV, { val: Number(sv_data[10]), ack: false });\n } else {\n this.log.error(`CCU system variable ${this.config.CCUSystemV} does not exist!`);\n }\n }\n } catch (error: unknown) {\n this.errorHandler(`handleCCUUpdate`, error);\n throw error;\n }\n }\n\n private updateExtendedStates(sv_data: string[], sv_prefix: string): void {\n this.updateState(`${sv_prefix}udc`, sv_data, 11);\n this.updateState(`${sv_prefix}idc`, sv_data, 12);\n this.updateState(`${sv_prefix}udcb`, sv_data, 13);\n this.updateState(`${sv_prefix}idcb`, sv_data, 14);\n this.updateState(`${sv_prefix}udcc`, sv_data, 15);\n this.updateState(`${sv_prefix}idcc`, sv_data, 16);\n this.updateState(`${sv_prefix}udcd`, sv_data, 17);\n this.updateState(`${sv_prefix}idcd`, sv_data, 18);\n\n if (sv_data.length === 27) {\n // Neue Version Solarview\n this.updateState(`${sv_prefix}ul1`, sv_data, 19);\n this.updateState(`${sv_prefix}il1`, sv_data, 20);\n this.updateState(`${sv_prefix}ul2`, sv_data, 21);\n this.updateState(`${sv_prefix}il2`, sv_data, 22);\n this.updateState(`${sv_prefix}ul3`, sv_data, 23);\n this.updateState(`${sv_prefix}il3`, sv_data, 24);\n this.updateState(`${sv_prefix}tkk`, sv_data, 25);\n } else if (sv_data.length === 23) {\n // Alte Version Solarview\n this.updateState(`${sv_prefix}ul1`, sv_data, 19);\n this.updateState(`${sv_prefix}il1`, sv_data, 20);\n this.updateState(`${sv_prefix}tkk`, sv_data, 21);\n }\n }\n\n private updateState(stateName: string, sv_data: string[], index: number): void {\n const value = Number(sv_data[index]);\n this.setStateChanged(stateName, { val: value, ack: true });\n }\n\n private async onReady(): Promise<void> {\n try {\n const starttime = this.config.intervalstart.split(':').slice(0, 2).join(':');\n const endtime = this.config.intervalend.split(':').slice(0, 2).join(':');\n\n this.log.info(\n `start solarview ${this.config.ipaddress}:${this.config.port} - polling interval: ${this.config.intervalVal}s (${starttime} to ${\n endtime\n })`,\n );\n this.log.info(`d0 converter: ${this.config.d0converter.toString()}`);\n\n await this.createGlobalObjects();\n\n await this.createSolarviewObjects('pvig', false);\n if (this.config.d0converter) {\n await this.createSolarviewObjects('d0supply', false);\n }\n if (this.config.d0converter) {\n await this.createSolarviewObjects('d0consumption', false);\n }\n if (this.config.scm0) {\n await this.createSolarviewObjects('scm0', false);\n }\n if (this.config.scm1) {\n await this.createSolarviewObjects('scm1', false);\n }\n if (this.config.scm2) {\n await this.createSolarviewObjects('scm2', false);\n }\n if (this.config.scm3) {\n await this.createSolarviewObjects('scm3', false);\n }\n if (this.config.scm4) {\n await this.createSolarviewObjects('scm4', false);\n }\n if (this.config.pvi1) {\n await this.createSolarviewObjects('pvi1', true);\n }\n if (this.config.pvi2) {\n await this.createSolarviewObjects('pvi2', true);\n }\n if (this.config.pvi3) {\n await this.createSolarviewObjects('pvi3', true);\n }\n if (this.config.pvi4) {\n await this.createSolarviewObjects('pvi4', true);\n }\n\n if (!this.config.interval_seconds) {\n await this.adjustIntervalToSeconds.call(this);\n }\n\n this.conn = new net.Socket();\n this.conn.setTimeout(2000);\n this.conn.on('data', this.onDataHandler.bind(this));\n this.conn.on('close', this.onCloseHandler.bind(this));\n this.conn.on('error', this.onErrorHandler.bind(this));\n this.conn.on('timeout', this.onTimeoutHandler.bind(this));\n\n //First start\n await this.setCmdQueue();\n\n this.jobSchedule = setInterval(async () => {\n try {\n await this.setCmdQueue();\n } catch (error: any) {\n this.log.error(`onReady.schedule: ${error.message}`);\n }\n }, this.config.intervalVal * 1000);\n } catch (error: unknown) {\n this.errorHandler(`onReady`, error);\n }\n }\n\n private onTimeoutHandler(): void {\n this.log.error('onTimeoutHandler: socket timeout');\n this.conn.end();\n }\n\n private async onDataHandler(data: any): Promise<void> {\n try {\n await this.processData(data);\n this.conn.end();\n } catch (error: unknown) {\n this.errorHandler(`conn.on data`, error);\n }\n }\n\n private processData = async (data: Buffer): Promise<void> => {\n try {\n const strdata: string[] = this.preprocessSolarviewData(data);\n const id = this.getSolarviewPrefix(strdata[0]);\n const cs: IChecksumResult = this.calcChecksum(data.toString('ascii'));\n if (cs.result) {\n await this.handleChecksumSuccess(strdata, id, data);\n } else {\n this.handleChecksumFailure(strdata, cs);\n }\n } catch (error: unknown) {\n this.errorHandler(`processData`, error);\n throw error;\n }\n };\n\n private async handleChecksumSuccess(sv_data: string[], sv_prefix: string, response: Buffer): Promise<void> {\n try {\n this.chkCnt = 0;\n this.log.debug(`${response.toString('ascii')}`);\n\n await this.updateSolarviewStates(sv_data, sv_prefix);\n\n const sDate = `${sv_data[3]}-${this.aLZ(parseInt(sv_data[2]))}-${this.aLZ(parseInt(sv_data[1]))} ${this.aLZ(parseInt(sv_data[4]))}:${this.aLZ(parseInt(sv_data[5]))}`;\n this.setStateChanged('info.lastUpdate', { val: sDate, ack: true });\n this.setStateChanged('info.connection', { val: true, ack: true });\n } catch (error: unknown) {\n this.errorHandler(`handleChecksumSuccess`, error);\n throw error;\n }\n }\n\n private handleChecksumFailure(sv_data: string[], csum: IChecksumResult): void {\n if (csum.chksum !== 0) {\n if (csum.data.toString('ascii') != ';-)\\n') {\n this.chkCnt += 1;\n this.log.warn(`checksum not correct! ${sv_data[0]}: ${csum.data.toString('ascii')}`);\n } else {\n //else -> option not supported from Solarview due to missing Inverter -> chksum ;-)\\n\n this.log.warn(`command ${this.lastCommand} not supported!`);\n }\n }\n }\n\n private async onCloseHandler(): Promise<void> {\n try {\n if (this.lastCommand) {\n this.log.debug(`Connection closed after executing command: ${this.lastCommand}`);\n } else {\n this.log.debug('Connection closed');\n }\n this.isProcessingCmd = false;\n if (this.chkCnt > 3) {\n await this.setState('info.connection', false, true);\n this.log.warn('Solarview Server is not reachable');\n this.chkCnt = 0;\n }\n } catch (error: unknown) {\n this.errorHandler(`conn.on close`, error);\n }\n }\n\n private onErrorHandler(error: unknown): void {\n this.errorHandler(`conn.on error - cmd: ${this.lastCommand}`, error);\n }\n\n private _sleep(milliseconds: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, milliseconds));\n }\n\n private connectAsync = (port: number, ip_address: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n this.conn.connect(port, ip_address, () => {\n resolve();\n });\n this.conn.on('error', err => {\n reject(err);\n });\n });\n };\n\n private async setCmdQueue(): Promise<void> {\n try {\n const commands: string[] = [];\n const { d0converter, scm0, scm1, scm2, scm3, scm4, pvi1, pvi2, pvi3, pvi4, intervalstart, intervalend } =\n this.config;\n\n const starttime = intervalstart.split(':').slice(0, 2).join(':');\n let endtime = intervalend.split(':').slice(0, 2).join(':');\n endtime = endtime === '00:00' ? '23:59' : endtime;\n\n const dnow = new Date();\n const dstart = new Date(`${dnow.getFullYear()}-${dnow.getMonth() + 1}-${dnow.getDate()} ${starttime}`);\n const dend = new Date(`${dnow.getFullYear()}-${dnow.getMonth() + 1}-${dnow.getDate()} ${endtime}`);\n\n if (dnow >= dstart && dnow <= dend) {\n commands.push('00*'); // pvig\n if (d0converter) {\n commands.push('21*');\n }\n if (pvi1) {\n commands.push('01*');\n }\n if (pvi2) {\n commands.push('02*');\n }\n if (pvi3) {\n commands.push('03*');\n }\n if (pvi4) {\n commands.push('04*');\n }\n }\n\n if (d0converter) {\n commands.push('22*');\n }\n if (scm0) {\n commands.push('10*');\n }\n if (scm1) {\n commands.push('11*');\n }\n if (scm2) {\n commands.push('12*');\n }\n if (scm3) {\n commands.push('13*');\n }\n if (scm4) {\n commands.push('14*');\n }\n\n // Befehle zur Warteschlange hinzuf\u00FCgen\n this.commandQueue.push(...commands);\n\n // Verarbeite die Warteschlange\n await this.processQueue();\n } catch (error: unknown) {\n this.errorHandler(`setCmdQueue`, error);\n }\n }\n\n private async processQueue(): Promise<void> {\n if (this.isProcessingQueue) {\n this.log.warn(`processQueue: command queue not empty! Waiting for solarview server ...`);\n return;\n }\n this.isProcessingQueue = true;\n\n while (this.commandQueue.length > 0) {\n if (!this.isProcessingCmd) {\n const cmd = this.commandQueue.shift();\n if (cmd) {\n try {\n this.isProcessingCmd = true;\n await this.executeCommand(cmd);\n if (this.isError === true) {\n this.log.info('Server connection is now working again!');\n this.isError = false;\n }\n } catch {\n this.isError = true;\n this.commandQueue.length = 0; // Queue l\u00F6schen\n this.isProcessingQueue = false;\n this.isProcessingCmd = false;\n }\n }\n }\n await this._sleep(500);\n }\n this.isProcessingQueue = false;\n }\n\n private async executeCommand(cmd: string): Promise<void> {\n this.log.debug(`Attempting to execute command: ${cmd}`);\n this.lastCommand = cmd;\n await this.connectAsync(this.config.port, this.config.ipaddress);\n this.conn.write(cmd);\n this.log.debug(`Command successfully sent: ${cmd}`);\n }\n\n private onUnload(callback: () => void): void {\n try {\n clearInterval(this.jobSchedule);\n clearTimeout(this.tout);\n this.conn.destroy();\n this.setStateChanged('info.connection', { val: false, ack: true });\n this.log.info('cleaned everything up...');\n callback();\n } catch (error: unknown) {\n this.errorHandler('onUnload', error);\n callback();\n }\n }\n\n private errorHandler(errTitle: string, error: unknown): void {\n if (error instanceof Error) {\n if (error.message.includes('EHOSTUNREACH') || error.message.includes('ECONNREFUSED')) {\n this.log.warn(`${errTitle}: Solarview server is not reachable! Please check the server.`);\n } else {\n this.log.error(`${errTitle}: ${error.message}\\nStacktrace: ${error.stack}`);\n }\n } else if (typeof error === 'string') {\n this.log.error(`${errTitle}: ${error}`);\n } else {\n this.log.error(`${errTitle}: Unknown error occurred: {error}`);\n }\n }\n}\n\nif (require.main !== module) {\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) => new Solarviewdatareader(options);\n} else {\n (() => new Solarviewdatareader())();\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "solarviewdatareader",
4
- "version": "1.2.3",
4
+ "version": "1.2.5",
5
5
  "news": {
6
+ "1.2.5": {
7
+ "en": "Adapter requires node.js >= 22 now\ndependencies updated\ndependabot.yml fixed [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\nlicense information updated",
8
+ "de": "Adapter benötigt node.js >= 22 jetzt\naktualisierte abhängigkeiten\nabhängigkeitabot.yml behoben [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\nlizenzinformationen aktualisiert",
9
+ "ru": "Адаптер требует node.js >= 22 сейчас\nобновленные зависимости\nhttps://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246\nлицензионная информация обновлена",
10
+ "pt": "Adaptador requer nod.js >= 22 agora\ndependências atualizadas\ndependebot.yml fixa [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\ninformação atualizada da licença",
11
+ "nl": "Voor de adapter zijn node.js < 22 nu nodig\nafhankelijkheden bijgewerkt\nafhankelijkabot.yml fixed [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\nlicentieinformatie bijgewerkt",
12
+ "fr": "Adaptateur nécessite node.js >= 22 maintenant\ndépendances mises à jour\ndependabot.yml corrigé [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\ninformations de licence mises à jour",
13
+ "it": "Adattatore richiede node.js >= 22 ora\ndipendenze aggiornate\ndipendeabot.yml fissato [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\ninformazioni sulla licenza aggiornate",
14
+ "es": "Adaptador requiere node.js ю= 22 ahora\ndependencias actualizadas\ndependabot.yml fixed [#246](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246)\ninformación actualizada sobre licencias",
15
+ "pl": "Adapter wymaga node.js > = 22\nzaktualizowane zależności\nconsiderabot.yml fixed [# 246] (https: / / github.com / afuerhoff / ioBroker.solarviewdatarader / issues / 246)\naktualizacja informacji licencyjnych",
16
+ "uk": "Адаптер вимагає node.js >= 22 тепер\nоновлені залежності\njavaScript licenses API Веб-сайт Go1.13.8\nінформація про ліцензію оновлено",
17
+ "zh-cn": "适配器需要节点.js 现在22\n更新依赖关系\ndeskabot.yml 已固定 [# 246] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/246) (中文(简体) )\n更新许可证信息"
18
+ },
19
+ "1.2.4": {
20
+ "en": "dependencies updated\nnpm security changes\nrepository checker warnings fixed",
21
+ "de": "aktualisierte abhängigkeiten\nnpm sicherheitsänderungen\nrepository checker warnungen fixiert",
22
+ "ru": "обновленные зависимости\nизменения в безопасности pm\nrepository checker предупреждения",
23
+ "pt": "dependências atualizadas\nalterações de segurança do npm\navisos de verificação de repositórios corrigidos",
24
+ "nl": "afhankelijkheden bijgewerkt\nnpm beveiligingswijzigingen\nrepository checker waarschuwingen vast",
25
+ "fr": "dépendances mises à jour\nnpm changements de sécurité\nalertes du contrôleur du dépôt corrigées",
26
+ "it": "dipendenze aggiornate\nnpm modifiche di sicurezza\nrepository checker avvisi fissi",
27
+ "es": "dependencias actualizadas\nnpm cambios de seguridad\nadvertencias de repositorio fijo",
28
+ "pl": "zaktualizowane zależności\nnpm zmiany bezpieczeństwa\nstałe ostrzeżenia o sprawdzaniu repozytorium",
29
+ "uk": "оновлені залежності\nзміни безпеки npm\nпопередження репозиторійних перевірок фіксованих",
30
+ "zh-cn": "更新依赖关系\nnpm 安全变化\n已确定仓库检查器警告"
31
+ },
6
32
  "1.2.3": {
7
33
  "en": "dependencies updated\nrepository checker issues fixed\ntypescript error fixed",
8
34
  "de": "Abhängigkeiten aktualisiert\nProbleme mit dem Repository-Checker behoben\nTypescript-Fehler behoben",
@@ -67,32 +93,6 @@
67
93
  "pl": "zaktualizowane zależności\nFixes [# 182] (https: / / github.com / afuerhoff / ioBroker.solarviewdatarader / issues / 182)",
68
94
  "uk": "оновлені залежності\nВиправлення [#182](https://github.com/afuerhoff/ioBroker.solarviewdatareader/products/182)",
69
95
  "zh-cn": "更新依赖关系\nFixs [#182] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/182) (英语)"
70
- },
71
- "1.1.3": {
72
- "en": "adapter checker changes [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndependencies updated",
73
- "de": "adapter-Checker ändert [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\naktualisierte abhängigkeiten",
74
- "ru": "изменение адаптера [#176] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\nобновленная информация о зависимостях",
75
- "pt": "alterações do verificador do adaptador [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndependências atualizadas",
76
- "nl": "wijzigingen van de adaptercontrole [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\nafhankelijkheden bijgewerkt",
77
- "fr": "changement d'adaptateur [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndépendances mises à jour",
78
- "it": "modifica dell'adattatore [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndipendenze aggiornate",
79
- "es": "adapter checker changes [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndependencias actualizadas",
80
- "pl": "zAŁĄCZNIK II\nzaktualizowane zależności",
81
- "uk": "[#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/products/176)\nоновлені залежності",
82
- "zh-cn": "适配器检查器改变 [# 176] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/ 1976) (中文(简体) )\n更新依赖关系"
83
- },
84
- "1.1.2": {
85
- "en": "adapter checker changes\ndependencies updated\nautomatic restart [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
86
- "de": "adapter checker änderungen\naktualisierte abhängigkeiten\nautomatischer Neustart [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
87
- "ru": "изменения адаптера\nобновленная информация о зависимостях\nавтоматический перезапуск [#170] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
88
- "pt": "alterações do verificador do adaptador\ndependências atualizadas\nautomatic restart [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
89
- "nl": "wijzigingen in de adaptercontrole\nafhankelijkheden bijgewerkt\nautomatische herstart [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
90
- "fr": "changement d'adaptateur\ndépendances mises à jour\nredémarrage automatique [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
91
- "it": "adattatore checker modifiche\ndipendenze aggiornate\nriavvio automatico [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
92
- "es": "cambios de control de adaptador\ndependencias actualizadas\nreinicio automático [#170](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170)",
93
- "pl": "zmiany w kontrolerze adaptera\nzaktualizowane zależności\nw załączniku II wprowadza się następujące zmiany:",
94
- "uk": "зміни адаптера\nоновлені залежності\nавтоматичний перезапуск [#170] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/products/170)",
95
- "zh-cn": "适配器检查器更改\n更新依赖关系\n自动重启 [# 170] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/170) (中文(简体) )"
96
96
  }
97
97
  },
98
98
  "titleLang": {
@@ -153,12 +153,12 @@
153
153
  },
154
154
  "dependencies": [
155
155
  {
156
- "js-controller": ">=5.0.19"
156
+ "js-controller": ">=6.0.11"
157
157
  }
158
158
  ],
159
159
  "globalDependencies": [
160
160
  {
161
- "admin": ">=6.17.14"
161
+ "admin": ">=7.6.20"
162
162
  }
163
163
  ]
164
164
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.solarviewdatareader",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Get data from SolarView",
5
5
  "author": {
6
6
  "name": "Achim Fürhoff",
@@ -22,27 +22,20 @@
22
22
  "@iobroker/adapter-core": "^3.3.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@alcalzone/release-script": "^3.8.0",
26
- "@alcalzone/release-script-plugin-iobroker": "^3.7.2",
27
- "@alcalzone/release-script-plugin-license": "^3.7.0",
28
- "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
29
- "@iobroker/adapter-dev": "^1.4.0",
30
- "@iobroker/eslint-config": "^2.1.0",
31
- "@iobroker/testing": "^5.1.1",
32
- "@tsconfig/node20": "^20.1.6",
33
- "@types/chai": "^4.3.20",
34
- "@types/chai-as-promised": "^7.1.8",
35
- "@types/mocha": "^10.0.10",
36
- "@types/node": "^22.18.6",
37
- "chai": "^4.5.0",
38
- "chai-as-promised": "^7.1.2",
39
- "mocha": "^10.8.2",
40
- "rimraf": "^5.0.10",
41
- "sinon": "^18.0.1",
42
- "sinon-chai": "^3.7.0",
25
+ "@alcalzone/release-script": "^5.2.0",
26
+ "@alcalzone/release-script-plugin-iobroker": "^5.2.0",
27
+ "@alcalzone/release-script-plugin-license": "^5.2.0",
28
+ "@alcalzone/release-script-plugin-manual-review": "^5.2.0",
29
+ "@iobroker/adapter-dev": "^1.5.0",
30
+ "@iobroker/eslint-config": "^2.3.4",
31
+ "@iobroker/testing": "^5.2.2",
32
+ "@iobroker/types": "^7.1.2",
33
+ "@tsconfig/node22": "^22.0.5",
34
+ "@types/node": "^22.19.19",
35
+ "rimraf": "^6.1.3",
43
36
  "source-map-support": "^0.5.21",
44
37
  "ts-node": "^10.9.2",
45
- "typescript": "^5.9.2"
38
+ "typescript": "^6.0.3"
46
39
  },
47
40
  "main": "build/main.js",
48
41
  "type": "commonjs",
@@ -79,6 +72,6 @@
79
72
  },
80
73
  "readmeFilename": "README.md",
81
74
  "engines": {
82
- "node": ">=20"
75
+ "node": ">=22"
83
76
  }
84
77
  }