iobroker.solarviewdatareader 1.2.4 → 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 +1 -1
- package/README.md +8 -10
- package/build/main.js +1 -1
- package/build/main.js.map +1 -1
- package/io-package.json +16 -16
- package/package.json +13 -13
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2019-
|
|
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,12 @@ 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
|
+
|
|
63
69
|
### 1.2.4 (2025-10-24)
|
|
64
70
|
* (afuerhoff) dependencies updated
|
|
65
71
|
* (afuerhoff) npm security changes
|
|
@@ -78,18 +84,10 @@ TKK= Temperature inverter
|
|
|
78
84
|
### 1.2.1 (2025-02-26)
|
|
79
85
|
* (afuerhoff) dependencies updated
|
|
80
86
|
|
|
81
|
-
|
|
82
|
-
* (afuerhoff) dependencies updated
|
|
83
|
-
* (afuerhoff) Migration to ESLint 9 and @iobroker/eslint-config - issue [#189]
|
|
84
|
-
* (afuerhoff) eslint: code optimized
|
|
85
|
-
* (afuerhoff) fixing chksum message if inverter 2 - 4 is not available
|
|
86
|
-
* (afuerhoff) logging optimized
|
|
87
|
-
* (afuerhoff) net handling optimized
|
|
88
|
-
|
|
89
|
-
## License
|
|
87
|
+
[Older changelogs can be found there](CHANGELOG_OLD.md)## License
|
|
90
88
|
MIT License
|
|
91
89
|
|
|
92
|
-
Copyright (c) 2019-
|
|
90
|
+
Copyright (c) 2019-2026 Achim Fürhoff <achim.fuerhoff@outlook.de>
|
|
93
91
|
|
|
94
92
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
95
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,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "solarviewdatareader",
|
|
4
|
-
"version": "1.2.
|
|
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
|
+
},
|
|
6
19
|
"1.2.4": {
|
|
7
20
|
"en": "dependencies updated\nnpm security changes\nrepository checker warnings fixed",
|
|
8
21
|
"de": "aktualisierte abhängigkeiten\nnpm sicherheitsänderungen\nrepository checker warnungen fixiert",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "zaktualizowane zależności\nFixes [# 182] (https: / / github.com / afuerhoff / ioBroker.solarviewdatarader / issues / 182)",
|
|
81
94
|
"uk": "оновлені залежності\nВиправлення [#182](https://github.com/afuerhoff/ioBroker.solarviewdatareader/products/182)",
|
|
82
95
|
"zh-cn": "更新依赖关系\nFixs [#182] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/182) (英语)"
|
|
83
|
-
},
|
|
84
|
-
"1.1.3": {
|
|
85
|
-
"en": "adapter checker changes [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndependencies updated",
|
|
86
|
-
"de": "adapter-Checker ändert [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\naktualisierte abhängigkeiten",
|
|
87
|
-
"ru": "изменение адаптера [#176] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\nобновленная информация о зависимостях",
|
|
88
|
-
"pt": "alterações do verificador do adaptador [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndependências atualizadas",
|
|
89
|
-
"nl": "wijzigingen van de adaptercontrole [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\nafhankelijkheden bijgewerkt",
|
|
90
|
-
"fr": "changement d'adaptateur [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndépendances mises à jour",
|
|
91
|
-
"it": "modifica dell'adattatore [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndipendenze aggiornate",
|
|
92
|
-
"es": "adapter checker changes [#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/176)\ndependencias actualizadas",
|
|
93
|
-
"pl": "zAŁĄCZNIK II\nzaktualizowane zależności",
|
|
94
|
-
"uk": "[#176](https://github.com/afuerhoff/ioBroker.solarviewdatareader/products/176)\nоновлені залежності",
|
|
95
|
-
"zh-cn": "适配器检查器改变 [# 176] (https://github.com/afuerhoff/ioBroker.solarviewdatareader/issues/ 1976) (中文(简体) )\n更新依赖关系"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -153,12 +153,12 @@
|
|
|
153
153
|
},
|
|
154
154
|
"dependencies": [
|
|
155
155
|
{
|
|
156
|
-
"js-controller": ">=
|
|
156
|
+
"js-controller": ">=6.0.11"
|
|
157
157
|
}
|
|
158
158
|
],
|
|
159
159
|
"globalDependencies": [
|
|
160
160
|
{
|
|
161
|
-
"admin": ">=6.
|
|
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
|
+
"version": "1.2.5",
|
|
4
4
|
"description": "Get data from SolarView",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Achim Fürhoff",
|
|
@@ -22,20 +22,20 @@
|
|
|
22
22
|
"@iobroker/adapter-core": "^3.3.2"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@alcalzone/release-script": "^5.
|
|
26
|
-
"@alcalzone/release-script-plugin-iobroker": "^
|
|
27
|
-
"@alcalzone/release-script-plugin-license": "^
|
|
28
|
-
"@alcalzone/release-script-plugin-manual-review": "^
|
|
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
29
|
"@iobroker/adapter-dev": "^1.5.0",
|
|
30
|
-
"@iobroker/eslint-config": "^2.
|
|
31
|
-
"@iobroker/testing": "^5.
|
|
32
|
-
"@iobroker/types": "^7.
|
|
33
|
-
"@tsconfig/
|
|
34
|
-
"@types/node": "^22.
|
|
35
|
-
"rimraf": "^6.
|
|
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",
|
|
36
36
|
"source-map-support": "^0.5.21",
|
|
37
37
|
"ts-node": "^10.9.2",
|
|
38
|
-
"typescript": "^
|
|
38
|
+
"typescript": "^6.0.3"
|
|
39
39
|
},
|
|
40
40
|
"main": "build/main.js",
|
|
41
41
|
"type": "commonjs",
|
|
@@ -72,6 +72,6 @@
|
|
|
72
72
|
},
|
|
73
73
|
"readmeFilename": "README.md",
|
|
74
74
|
"engines": {
|
|
75
|
-
"node": ">=
|
|
75
|
+
"node": ">=22"
|
|
76
76
|
}
|
|
77
77
|
}
|