UNPKG

iobroker.luxtronik1

Version:
1,273 lines (1,136 loc) 69.3 kB
/** * luxtronik1 adapter */ /* jshint -W097 */ // jshint strict:false /*jslint node: true */ 'use strict'; const utils = require('@iobroker/adapter-core'); // Get common adapter utils let adapter; var deviceIpAdress; var port; var net = require('net'); var datastring = ""; var data1800array = []; var data1100error = 0; var data1800error = 0; var data2100error = 0; var data3405error = 0; var data3505error = 0; var data3200error = 0; var data3400error = 0; var temperaturen = []; //1100 var eingaenge = []; //1200 var ausgaenge = []; //1300 var ablaufzeiten = []; //1400 var betriebsstunden = []; var fehlerspeicher = []; var abschaltungen = []; var anlstat = []; var modus = ['AUTO', 'ZWE', 'Party', 'Ferien', 'Aus', 'Aus']; var data3400array = []; var data2100array = []; var data3201array = ['3201', '8']; //BW-Sperre alle Tage var data2701array = ['2701', '7']; //Datum und Zeit var hkdata; var instance; var errorcount; var schaltzbwblock = false; var zeitblock = false; var clientconnection = false; var hkfunction = false; var hystfunction = false; var pollfunction = false; var warteauf = ""; var clientconnectionerror = 0; var lastsetbws; let polling; function startAdapter(options) { options = options || {}; Object.assign(options, { name: 'luxtronik1' }); adapter = new utils.Adapter(options); // when adapter shuts down adapter.on('unload', function(callback) { try { clearTimeout(polling); adapter.log.info('[END] Stopping luxtronik adapter...'); adapter.setState('info.connection', false, true); callback(); } catch (e) { adapter.log && adapter.log.warn("[END 7 catch] adapter stopped " + e); callback(); } }); // is called if a subscribed object changes adapter.on('objectChange', function(id, obj) { // Warning, obj can be null if it was deleted adapter.log.info('objectChange ' + id + ' ' + JSON.stringify(obj)); }); // is called if a subscribed state changes adapter.on('stateChange', function(id, state) { // Warning, state can be null if it was deleted try { adapter.log.debug('stateChange ' + id + ' ' + JSON.stringify(state)); //adapter.log.debug("Adapter=" + adapter.toString()); if (!id || state.ack) return; // Ignore acknowledged state changes or error states instance = id.substring(0, adapter.namespace.length); adapter.log.debug("Instanz: " + instance); id = id.substring(adapter.namespace.length + 1); // remove instance name and id state = state.val; adapter.log.debug("id=" + id); controlluxtronik(id, state); // you can use the ack flag to detect if it is status (true) or command (false) if (state && !state.ack) { adapter.log.info('ack is not set!'); } } catch (e) { adapter.log.debug("Fehler Befehlsauswertung: " + e); } }); // Some message was sent to adapter instance over message box. Used by email, pushover, text2speech, ... adapter.on('message', function(obj) { if (typeof obj === 'object' && obj.message) { if (obj.command === 'send') { // e.g. send email or pushover or whatever adapter.log('send command'); // Send response in callback if required if (obj.callback) adapter.sendTo(obj.from, obj.command, 'Message received', obj.callback); } } }); // is called when databases are connected and adapter received configuration. adapter.on('ready', function() { if (adapter.config.host) { adapter.log.info('[START] Starting luxtronik adapter'); instance = adapter.namespace.toString() adapter.log.debug("Instanz " + instance + " gestartet"); adapter.setState('info.connection', true, true); main(); } else adapter.log.warn('[START] No IP-address set'); }); return adapter; } // endStartAdapter function main() { // Vars deviceIpAdress = adapter.config.host; port = adapter.config.port; const pollingTime = adapter.config.pollInterval || 300000; adapter.log.debug('[INFO] Configured polling interval: ' + pollingTime); adapter.log.debug('[START] Started Adapter with: ' + adapter.config.host); pollluxtronik(); if (!polling) { polling = setTimeout(function repeat() { // poll states every [30] seconds pollluxtronik(); //DATAREQUEST; setTimeout(repeat, pollingTime); }, pollingTime); } // endIf // all states changes inside the adapters namespace are subscribed adapter.subscribeStates('control.*'); } // endMain function pollluxtronik() { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 3) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } adapter.log.debug("Daten werden mit nächstem Polling gelesen"); //setTimeout(pollluxtronik, 5000); } else { clientconnectionerror = 0; pollfunction = true; callluxtronik1800(); setTimeout(callluxtronik2100, 2000); setTimeout(callluxtronik3405, 4000); setTimeout(callluxtronik3505, 6000); setTimeout(callluxtronik3400, 8000); setTimeout(callluxtronik3200, 10000); } } //endPollluxtronik function controlluxtronik(id, state) { try { switch (id) { case "control.BWs": adapter.log.debug("Setze Warmwasser-Soll auf: " + state); lastsetbws = state * 10; controlbws(state * 10); break; case "control.ModusWW": adapter.log.debug("Setze Modus Warmwasser auf: " + modus[state]); controlmodusww(state); break; case "control.ModusHeizung": adapter.log.debug("Setze Modus Heizung auf: " + modus[state]); controlmodusheizung(state); break; case "control.NachtAbs": adapter.log.debug("Setze Nachtabsenkung auf: " + state + "°C"); controlnachtabs(state * 10); break; case "control.ParaVHK": adapter.log.debug("Setze Parallelverschiebung Heizkurve auf: " + state + "°C"); controlparavhk(state * 10); break; case "control.EndpunktHK": adapter.log.debug("Setze Endpunkt Heizkurve auf: " + state + "°C"); controlendpunkthk(state * 10); break; case "control.AbwRLs": adapter.log.debug("Setze Abweichung Rücklauf SOLL auf: " + state + "°C"); controlabwrls(state * 10); break; case "control.HystBWs": adapter.log.debug("Setze Hystere Brauchwasser auf: " + state + "°C"); controlhystbw(state * 10); break; case "control.HystHKs": adapter.log.debug("Setze Hystere Brauchwasser auf: " + state + "°C"); controlhysthk(state * 10); break; case "control.SchaltzWoBW.senden": adapter.log.debug("Sende Schaltzeiten BW Woche"); adapter.getState("control.SchaltzWoBW.Start1", function(err, state) { if (state) { data3201array[2] = Number((state.val).slice(0, 2)); data3201array[3] = Number((state.val).slice(-2)); adapter.getState("control.SchaltzWoBW.Ende1", function(err, state) { if (state) { data3201array[4] = Number((state.val).slice(0, 2)); data3201array[5] = Number((state.val).slice(-2)); adapter.getState("control.SchaltzWoBW.Start2", function(err, state) { if (state) { data3201array[6] = Number((state.val).slice(0, 2)); data3201array[7] = Number((state.val).slice(-2)); adapter.getState("control.SchaltzWoBW.Ende2", function(err, state) { if (state) { data3201array[8] = Number((state.val).slice(0, 2)); data3201array[9] = Number((state.val).slice(-2)); controlSchaltzWoBW(data3201array); } else { adapterl.log.debug("Fehler beim Auslesen der BW-Schaltzeiten Woche"); } }); } else { adapterl.log.debug("Fehler beim Auslesen der BW-Schaltzeiten Woche"); } }); } else { adapterl.log.debug("Fehler beim Auslesen der BW-Schaltzeiten Woche"); } }); } else { adapterl.log.debug("Fehler beim Auslesen der BW-Schaltzeiten Woche"); } }); break case "control.Zeit.senden": adapter.log.debug("Sende Zeit und Datum"); adapter.getState("control.Zeit.datum", function(err, state) { if (state) { data2701array[2] = Number((state.val).slice(-2)); data2701array[3] = Number((state.val).slice(3, 5)); data2701array[4] = Number((state.val).slice(0, 2)); adapter.getState("control.Zeit.dow", function(err, state) { if (state) { data2701array[5] = state.val; adapter.getState("control.Zeit.uhrzeit", function(err, state) { if (state) { data2701array[6] = Number((state.val).slice(0, 2)); data2701array[7] = Number((state.val).slice(3, 5)); data2701array[8] = Number((state.val).slice(-2)); controlZeit(data2701array); } else { adapterl.log.debug("Fehler beim Auslesen der Zeitfelder"); } }); } else { adapterl.log.debug("Fehler beim Auslesen der Zeitfelder"); } }); } else { adapterl.log.debug("Fehler beim Auslesen der Zeitfelder"); } }); break default: if (id.includes("control.SchaltzWoBW.Start") || id.includes("control.SchaltzWoBW.Ende")) { schaltzbwblock = true; setTimeout(function() { schaltzbwblock = false; }, 60000); } else if (id.includes("control.Zeit.uhrzeit") || id.includes("control.Zeit.dow") || id.includes("control.Zeit.datum")) { zeitblock = true; setTimeout(function() { zeitblock = false; }, 60000); } } } catch (e) { adapter.log.warn("controlluxtronik-Fehler: " + e) } } //end controlluxtronik function controlbws(statebws) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlbws(statebws); }, 1000); return; } clientconnectionerror = 0; callluxtronik3501(statebws); } //end controlbws function controlmodusww(statemodusww) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlmodusww(statemodusww); }, 1000); return; } clientconnectionerror = 0; callluxtronik3506(statemodusww); } //end controlmodusww function controlmodusheizung(statemodusheizung) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlmodusheizung(statemodusheizung); }, 1000); return; } clientconnectionerror = 0; callluxtronik3406(statemodusheizung); } //end controlmodusheizung function controlabwrls(stateabwrls) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlabwrls(stateabwrls); }, 1000); return; } clientconnectionerror = 0; hkfunction = true; adapter.log.debug("Heizkurvenfunktion aktiviert"); callluxtronik3400(); setTimeout(function() { var dataHK = data3400array; dataHK[0] = 3401; dataHK[2] = stateabwrls; callluxtronik3401(dataHK); }, 2000); setTimeout(callluxtronik3400, 7000); } //end controlabwrls function controlnachtabs(statenachtabs) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlnachtabs(statenachtabs); }, 1000); return; } clientconnectionerror = 0; hkfunction = true; adapter.log.debug("Heizkurvenfunktion aktiviert"); callluxtronik3400(); setTimeout(function() { var dataHK = data3400array; dataHK[0] = 3401; dataHK[5] = statenachtabs; callluxtronik3401(dataHK); }, 2000); setTimeout(callluxtronik3400, 7000); } //end controlnachtabs function controlparavhk(stateparavhk) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlparavhk(stateparavhk); }, 1000); return; } clientconnectionerror = 0; hkfunction = true; adapter.log.debug("Heizkurvenfunktion aktiviert"); callluxtronik3400(); setTimeout(function() { var dataHK = data3400array; dataHK[0] = 3401; dataHK[4] = stateparavhk; callluxtronik3401(dataHK); }, 2000); setTimeout(callluxtronik3400, 7000); } //end controlparavhk function controlendpunkthk(stateendpunkthk) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlendpunkthk(stateendpunkthk); }, 1000); return; } clientconnectionerror = 0; hkfunction = true; adapter.log.debug("Heizkurvenfunktion aktiviert"); callluxtronik3400(); setTimeout(function() { var dataHK = data3400array; dataHK[0] = 3401; dataHK[3] = stateendpunkthk; callluxtronik3401(dataHK); }, 2000); setTimeout(callluxtronik3400, 7000); } //end controlendpunkthk function controlhystbw(statehystbw) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlhystbw(statehystbw); }, 1000); return; } clientconnectionerror = 0; hystfunction = true; adapter.log.debug("Hysteresefunktion aktiviert"); callluxtronik2100(); setTimeout(function() { var dataHyst = data2100array; dataHyst[0] = 2101; dataHyst[9] = statehystbw; callluxtronik2101(dataHyst); }, 2000); setTimeout(callluxtronik2100, 7000); } //end controlhystbw function controlhysthk(statehysthk) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlhysthk(statehysthk); }, 1000); return; } clientconnectionerror = 0; hystfunction = true; adapter.log.debug("Hysteresefunktion aktiviert"); callluxtronik2100(); setTimeout(function() { var dataHyst = data2100array; dataHyst[0] = 2101; dataHyst[3] = statehysthk; callluxtronik2101(dataHyst); }, 2000); setTimeout(callluxtronik2100, 7000); } //end controlhysthk function controlSchaltzWoBW(data3201array) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlSchaltzWoBW(data3201array); }, 1000); return; } clientconnectionerror = 0; schaltzbwblock = false; callluxtronik3201(data3201array); } //end controlSchaltzWoBW function controlZeit(data2701array) { if (clientconnection == true) { adapter.log.debug("warte auf " + warteauf); clientconnectionerror++; if (clientconnectionerror > 10) { adapter.log.warn("Verbindungsprobleme, starte Adapter neu"); restartAdapter(); } setTimeout(function() { controlZeit(data2701array); }, 1000); return; } clientconnectionerror = 0; schaltzbwblock = false; callluxtronik2701(data2701array); } //end controlZeit function callluxtronik1100() { clientconnection = true; warteauf = "callluxtronik1100"; var datacount1100 = 0; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('1100\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("1100 connection error: " + ex); }); client.on('data', function(data) { datastring += data; datacount1100++; if (datastring.includes("1100") === true && (datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { datacount1100 = 0; adapter.log.debug("Data1100 complete, destroy connection") client.destroy(); } else if (datacount1100 > 5) { datacount1100 = 0; adapter.log.debug("Data1100 NOT complete, destroy connection") client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 40) { var data1100array = datastring.split(';'); adapter.log.debug("Anzahl Elemente data1100array: " + data1100array.length); adapter.log.debug("Anzahl Elemente data1100array SOLL: " + (parseInt(data1100array[1]) + 2)) if (data1100array.length === parseInt(data1100array[1]) + 2) { adapter.log.debug("Datensatz 1100: " + data1100array); if (data1100array[8] != lastsetbws) { adapter.log.info("BW-Solltemperatur nicht korrekt gesetzt, Vorgang wird wiederholt"); data1100error++; if (data1100error < 6) { controlbws(lastsetbws); } else { adapter.log.warn("Achtung, Setzen korrekter BW-Solltemperatur mehrmals fehlgeschlagen"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } else { data1100error = 0; adapter.setState("temperaturen.AUT", data1100array[6] / 10, true); adapter.setState("temperaturen.RL", data1100array[3] / 10, true); adapter.setState("temperaturen.VL", data1100array[2] / 10, true); adapter.setState("temperaturen.RLs", data1100array[4] / 10, true); adapter.setState("temperaturen.HG", data1100array[5] / 10, true); adapter.setState("temperaturen.BWi", data1100array[7] / 10, true); adapter.setState("temperaturen.BWs", data1100array[8] / 10, true); adapter.setState("temperaturen.WQe", data1100array[9] / 10, true); adapter.setState("temperaturen.WQa", data1100array[10] / 10, true); adapter.setState("temperaturen.MK1VLi", data1100array[11] / 10, true); adapter.setState("temperaturen.MK1VLs", data1100array[12] / 10, true); adapter.setState("temperaturen.RS", data1100array[13] / 10, true); } } else { adapter.log.debug("Datenarray1100 unvollständig, keine Werte gesetzt"); data1100error++; } } else { adapter.log.debug("Datensatz1100 unvollständig, keine Werte gesetzt"); data1100error++; } if (data1100error > 4) { adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 1100"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik1100 - Fehler: " + e); } adapter.log.debug("Daten 1100 fertig verarbeitet.") clientconnection = false; }); } //callluxtronik1100 function callluxtronik1800() { clientconnection = true; warteauf = "callluxtronik1800"; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('1800\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("1800 connection error: " + ex); }); client.on('data', function(data) { datastring += data; if (datastring.includes("1800;8", 10) === true) { client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 500) { data1800array = datastring.split('\r\n'); adapter.log.debug("Datensatz 1800: " + data1800array); adapter.log.debug("Anzahl Elemente data1800array: " + data1800array.length); if (data1800array.length > 21) { temperaturen = data1800array[2].split(';'); //1100 adapter.setState("temperaturen.AUT", temperaturen[6] / 10, true); adapter.setState("temperaturen.RL", temperaturen[3] / 10, true); adapter.setState("temperaturen.VL", temperaturen[2] / 10, true); adapter.setState("temperaturen.RLs", temperaturen[4] / 10, true); adapter.setState("temperaturen.HG", temperaturen[5] / 10, true); adapter.setState("temperaturen.BWi", temperaturen[7] / 10, true); adapter.setState("temperaturen.BWs", temperaturen[8] / 10, true); if (pollfunction == true) { adapter.setState("control.BWs", temperaturen[8] / 10, true); } adapter.setState("temperaturen.WQe", temperaturen[9] / 10, true); adapter.setState("temperaturen.WQa", temperaturen[10] / 10, true); adapter.setState("temperaturen.MK1VLi", temperaturen[11] / 10, true); adapter.setState("temperaturen.MK1VLs", temperaturen[12] / 10, true); adapter.setState("temperaturen.RS", temperaturen[13] / 10, true); eingaenge = data1800array[3].split(';'); //1200 adapter.setState("eingaenge.ASD", !!+eingaenge[2], true); adapter.setState("eingaenge.EVU", !!+eingaenge[3], true); adapter.setState("eingaenge.HD", !!+eingaenge[4], true); adapter.setState("eingaenge.MOT", !!+eingaenge[5], true); adapter.setState("eingaenge.ND", !!+eingaenge[6], true); adapter.setState("eingaenge.PEX", !!+eingaenge[7], true); ausgaenge = data1800array[4].split(';'); //1300 var solpu = "Ventilator_Brunnen_oder_Soleumwaelzpumpe"; adapter.setState("ausgaenge.Abtauventil", !!+ausgaenge[2], true); adapter.setState("ausgaenge.Brauchwarmwasserumwaelzpumpe", !!+ausgaenge[3], true); adapter.setState("ausgaenge.Fussbodenheizungsumwaelzpumpe", !!+ausgaenge[4], true); adapter.setState("ausgaenge.Heizungsumwaelzpumpe", !!+ausgaenge[5], true); adapter.setState("ausgaenge.Mischer_1_Auf", !!+ausgaenge[6], true); adapter.setState("ausgaenge.Mischer_1_Zu", !!+ausgaenge[7], true); adapter.setState("ausgaenge.Ventilation_des_Waermepumpengehaeuses", !!+ausgaenge[8], true); adapter.setState("ausgaenge." + solpu, !!+ausgaenge[9], true); adapter.setState("ausgaenge.Verdichter_1_in_Waermepumpe", !!+ausgaenge[10], true); adapter.setState("ausgaenge.Verdichter_2_in_Waermepumpe", !!+ausgaenge[11], true); adapter.setState("ausgaenge.Zusatzumwaelzpumpe_Zirkulationspumpe", !!+ausgaenge[12], true); adapter.setState("ausgaenge.Zweiter_Waermeerzeuger_1", !!+ausgaenge[13], true); adapter.setState("ausgaenge.Zweiter_Waermeerzeuger_2_Sammelstoerung", !!+ausgaenge[14], true); ablaufzeiten = data1800array[5].split(';'); //1400 adapter.getState('ablaufzeiten.WPseit', function(err, state) { if (state) { adapter.log.debug("Laufzeit:" + (parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])) + " Vorwert: " + state.val); if ((parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])) == 0 && state.val > 0) { adapter.setState('ablaufzeiten.WPseitlast', state.val, true); adapter.setState("ablaufzeiten.WPseit", (parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])), true); adapter.log.debug("neue letzte Laufzeit gesetzt"); } else if ((parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])) > state.val) { adapter.log.debug("WP läuft, WPseitlast wird ersetzt, wenn WP wieder steht"); adapter.setState("ablaufzeiten.WPseit", (parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])), true); } else { adapter.log.debug("keine Änderung"); adapter.setState("ablaufzeiten.WPseit", (parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])), true); } } else { adapterl.log.debug("kein State"); adapter.setState("ablaufzeiten.WPseit", (parseInt(ablaufzeiten[2]) * 3600 + parseInt(ablaufzeiten[3]) * 60 + parseInt(ablaufzeiten[4])), true); } }); adapter.setState("ablaufzeiten.ZWE1seit", (parseInt(ablaufzeiten[5]) * 3600 + parseInt(ablaufzeiten[6]) * 60 + parseInt(ablaufzeiten[7])), true); adapter.setState("ablaufzeiten.ZWE2seit", (parseInt(ablaufzeiten[8]) * 3600 + parseInt(ablaufzeiten[9]) * 60 + parseInt(ablaufzeiten[10])), true); adapter.setState("ablaufzeiten.Netzeinv", (parseInt(ablaufzeiten[11])), true); adapter.setState("ablaufzeiten.SSPstand", (parseInt(ablaufzeiten[12]) * 60 + parseInt(ablaufzeiten[13])), true); adapter.setState("ablaufzeiten.SSPverz", (parseInt(ablaufzeiten[14]) * 60 + parseInt(ablaufzeiten[15])), true); adapter.setState("ablaufzeiten.VDstand", (parseInt(ablaufzeiten[16]) * 3600 + parseInt(ablaufzeiten[17]) * 60 + parseInt(ablaufzeiten[18])), true); adapter.setState("ablaufzeiten.HRM", (parseInt(ablaufzeiten[19]) * 3600 + parseInt(ablaufzeiten[20]) * 60 + parseInt(ablaufzeiten[21])), true); adapter.setState("ablaufzeiten.HRW", (parseInt(ablaufzeiten[22]) * 3600 + parseInt(ablaufzeiten[23]) * 60 + parseInt(ablaufzeiten[24])), true); adapter.setState("ablaufzeiten.TDIseit", (parseInt(ablaufzeiten[25]) * 3600 + parseInt(ablaufzeiten[26]) * 60 + parseInt(ablaufzeiten[27])), true); adapter.setState("ablaufzeiten.BWsperre", (parseInt(ablaufzeiten[28]) * 3600 + parseInt(ablaufzeiten[29]) * 60 + parseInt(ablaufzeiten[30])), true); betriebsstunden = data1800array[6].split(';'); adapter.setState("betriebsstunden.VD1", toTimeString(betriebsstunden[2]), true); adapter.setState("betriebsstunden.Imp1", betriebsstunden[3], true); adapter.setState("betriebsstunden.AvVD1", toTimeString(betriebsstunden[4]), true); adapter.setState("betriebsstunden.VD2", toTimeString(betriebsstunden[5]), true); adapter.setState("betriebsstunden.Imp2", betriebsstunden[6], true); adapter.setState("betriebsstunden.AvVD2", toTimeString(betriebsstunden[7]), true); adapter.setState("betriebsstunden.ZWE1", toTimeString(betriebsstunden[8]), true); adapter.setState("betriebsstunden.ZWE2", toTimeString(betriebsstunden[9]), true); adapter.setState("betriebsstunden.WP", toTimeString(betriebsstunden[10]), true); adapter.log.debug("BWP" + toTimeString(betriebsstunden[10]) + "hhhh"); for (var i = 1; i < 6; i++) { adapter.setState("fehler." + (6 - i), setfehlertext(data1800array[7 + i]), true); } for (var i = 1; i < 6; i++) { adapter.setState("abschaltungen." + (6 - i), setabschalttext(data1800array[14 + i]), true); } adapter.setState("status.WPtyp", String((data1800array[21].split(';'))[2]), true); adapter.setState("status.SW", String((data1800array[21].split(';'))[3]), true); adapter.setState("status.BivStufe", String((data1800array[21].split(';'))[4]), true); adapter.setState("status.ANL", setstatustext(String(data1800array[21])), true); data1800error = 0; } else { adapter.log.debug("Datenarray1800 unvollständig, keine Werte gesetzt"); data1800error++; } } else { adapter.log.debug("Datensatz1800 unvollständig, keine Werte gesetzt"); data1800error++; } if (data1800error > 4) { adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 1800"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik1800 - Fehler: " + e); } adapter.log.debug("Daten 1800 fertig verarbeitet.") if (pollfunction == false) { clientconnection = false; } }); } //callluxtronik1800 function callluxtronik2100() { clientconnection = true; warteauf = "callluxtronik2100"; var datacount2100 = 0; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('2100\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("2100 connection error: " + ex); }); client.on('data', function(data) { datastring += data; adapter.log.debug("Datastring: " + datastring); datacount2100++; if (datastring.includes("2100") === true && (datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { datacount2100 = 0; adapter.log.debug("Data complete, destroy connection") client.destroy(); } else if (datacount2100 > 5) { datacount2100 = 0; adapter.log.debug("Data2100 NOT complete, destroy connection") client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 10) { var data2100array = datastring.split(';'); adapter.log.debug("Anzahl Elemente data2100array: " + data2100array.length); adapter.log.debug("Anzahl Elemente data2100array SOLL: " + (parseInt(data2100array[1]) + 2)) if (data2100array.length === parseInt(data2100array[1]) + 2) { adapter.log.debug("Anzahl Elemente data2100array: " + data2100array.length); adapter.log.debug("Datensatz 2100: " + data2100array); adapter.setState("temperaturen.einstellungen.RLBegr", data2100array[2] / 10, true); adapter.setState("temperaturen.einstellungen.HystHR", data2100array[3] / 10, true); if (pollfunction == true) { adapter.setState("control.HystHKs", data2100array[3] / 10, true); } adapter.setState("temperaturen.einstellungen.TRErhMax", data2100array[4] / 10, true); adapter.setState("temperaturen.einstellungen.Freig2VD", data2100array[5] / 10, true); adapter.setState("temperaturen.einstellungen.FreigZWE", data2100array[6] / 10, true); adapter.setState("temperaturen.einstellungen.T-Luftabt", data2100array[7] / 10, true); adapter.setState("temperaturen.einstellungen.TDIsoll", data2100array[8] / 10, true); adapter.setState("temperaturen.einstellungen.HystBW", data2100array[9] / 10, true); if (pollfunction == true) { adapter.setState("control.HystBWs", data2100array[9] / 10, true); } adapter.setState("temperaturen.einstellungen.VL2VDBW", data2100array[10] / 10, true); adapter.setState("temperaturen.einstellungen.TAussenMax", data2100array[11] / 10, true); adapter.setState("temperaturen.einstellungen.TAussenMin", data2100array[12] / 10, true); adapter.setState("temperaturen.einstellungen.TWQMin", data2100array[13] / 10, true); adapter.setState("temperaturen.einstellungen.THGMax", data2100array[14] / 10, true); adapter.setState("temperaturen.einstellungen.TLAbtEnde", data2100array[15] / 10, true); adapter.setState("temperaturen.einstellungen.AbsenkBis", data2100array[16] / 10, true); adapter.setState("temperaturen.einstellungen.VLmax", data2100array[17] / 10, true); data2100error = 0; } else { adapter.log.debug("Datenarray2100 unvollständig, keine Werte gesetzt") data2100error++; } } else { adapter.log.debug("Datensatz2100 unvollständig, keine Werte gesetzt") data2100error++; } if (data2100error > 4) { data2100error = 0; adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 2100"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik2100 - Fehler: " + e); } adapter.log.debug("Daten 2100 fertig verarbeitet.") if (pollfunction == false) { clientconnection = false; } }); } //end callluxtronik2100 function callluxtronik3405() { clientconnection = true; warteauf = "callluxtronik3405"; var datacount3405 = 0; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('3405\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("3405 connection error: " + ex); }); client.on('data', function(data) { datastring += data; datacount3405++; if (datastring.includes("3405") === true && (datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { datacount3405 = 0; adapter.log.debug("Data complete, destroy connection") client.destroy(); } else if (datacount3405 > 5) { datacount3405 = 0; adapter.log.debug("Data3405 NOT complete, destroy connection") client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 7) { var data3405array = datastring.split(';'); adapter.log.debug("Anzahl Elemente data3405array: " + data3405array.length); adapter.log.debug("Anzahl Elemente data3405array SOLL: " + (parseInt(data3405array[1]) + 2)) if (data3405array.length === parseInt(data3405array[1]) + 2) { adapter.log.debug("Datensatz 3405: " + data3405array[2]); adapter.log.debug("Modus Heizung: " + modus[parseInt(data3405array[2])]); adapter.setState("status.ModusHeizung", parseInt(data3405array[2]), true); if (pollfunction == true) { adapter.setState("control.ModusHeizung", parseInt(data3405array[2]), true); } data3405error = 0; } else { adapter.log.debug("Datenarray3405 unvollständig, keine Werte gesetzt") data3405error++; } } else { adapter.log.debug("Datensatz3405 unvollständig, keine Werte gesetzt") data3405error++; } if (data3405error > 4) { adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 3405"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik3405 - Fehler: " + e); } adapter.log.debug("Daten 3405 fertig verarbeitet.") if (pollfunction == false) { clientconnection = false; } }); } //endcallluxtronik3405 function callluxtronik3505() { clientconnection = true; warteauf = "callluxtronik3505"; var datacount3505 = 0; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('3505\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("3505 connection error: " + ex); }); client.on('data', function(data) { datastring += data; datacount3505++; if (datastring.includes("3505;1") === true && (datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { datacount3505 = 0; adapter.log.debug("Data complete, destroy connection") client.destroy(); } else if (datacount3505 > 5) { datacount3505 = 0; adapter.log.debug("Data3505 NOT complete, destroy connection") client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 7) { var data3505array = datastring.split(';'); adapter.log.debug("Anzahl Elemente data3505array: " + data3505array.length); adapter.log.debug("Anzahl Elemente data3505array SOLL: " + (parseInt(data3505array[1]) + 2)); if (data3505array.length === parseInt(data3505array[1]) + 2) { adapter.log.debug("Datensatz 3505: " + data3505array[2]); adapter.log.debug("Modus Warmwasser: " + modus[parseInt(data3505array[2])]); adapter.setState("status.ModusWW", parseInt(data3505array[2]), true); if (pollfunction == true) { adapter.setState("control.ModusWW", parseInt(data3505array[2]), true); } data3505error = 0; } else { adapter.log.debug("Datenarray3505 unvollständig, keine Werte gesetzt"); data3505error++; } } else { adapter.log.debug("Datensatz3505 unvollständig, keine Werte gesetzt"); data3505error++; } if (data3505error > 4) { adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 3505"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik3505 - Fehler: " + e); } adapter.log.debug("Daten 3505 fertig verarbeitet.") if (pollfunction == false) { clientconnection = false; } }); } //endcallluxtronik3505 function callluxtronik3200() { clientconnection = true; warteauf = "callluxtronik3200"; var datacount3200 = 0; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('3200\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("3200 connection error: " + ex); }); client.on('data', function(data) { datastring += data; datacount3200++; if (datastring.includes("3200;8") === true && (datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { datacount3200 = 0; adapter.log.debug("Data complete, destroy connection") client.destroy(); } else if (datacount3200 > 5) { datacount3200 = 0; adapter.log.debug("Data3200 NOT complete, destroy connection") client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 15) { var data3200array = (datastring.replace(/(\r\n|\n|\r)/gm, "")).split(';'); adapter.log.debug("Anzahl Elemente datacount3200array: " + data3200array.length); adapter.log.debug("Anzahl Elemente data3200array SOLL: " + (parseInt(data3200array[1]) + 2)); if ((datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { adapter.log.debug("Datensatz 3200: " + data3200array); adapter.log.debug("Schaltzeiten BW Woche: "); adapter.log.debug("Start1: " + data3200array[2].padStart(2, '0') + ":" + data3200array[3].padStart(2, '0')); adapter.log.debug("Ende1: " + data3200array[4].padStart(2, '0') + ":" + data3200array[5].padStart(2, '0')); adapter.log.debug("Start2: " + data3200array[6].padStart(2, '0') + ":" + data3200array[7].padStart(2, '0')); adapter.log.debug("Ende2: " + data3200array[8].padStart(2, '0') + ":" + data3200array[9].padStart(2, '0')); if (schaltzbwblock == false) { adapter.setState("control.SchaltzWoBW.Start1", data3200array[2].padStart(2, '0') + ":" + data3200array[3].padStart(2, '0'), true); adapter.setState("control.SchaltzWoBW.Ende1", data3200array[4].padStart(2, '0') + ":" + data3200array[5].padStart(2, '0'), true); adapter.setState("control.SchaltzWoBW.Start2", data3200array[6].padStart(2, '0') + ":" + data3200array[7].padStart(2, '0'), true); adapter.setState("control.SchaltzWoBW.Ende2", data3200array[8].padStart(2, '0') + ":" + data3200array[9].padStart(2, '0'), true); } adapter.setState("status.SchaltzWoBW.Start1", data3200array[2].padStart(2, '0') + ":" + data3200array[3].padStart(2, '0'), true); adapter.setState("status.SchaltzWoBW.Ende1", data3200array[4].padStart(2, '0') + ":" + data3200array[5].padStart(2, '0'), true); adapter.setState("status.SchaltzWoBW.Start2", data3200array[6].padStart(2, '0') + ":" + data3200array[7].padStart(2, '0'), true); adapter.setState("status.SchaltzWoBW.Ende2", data3200array[8].padStart(2, '0') + ":" + data3200array[9].padStart(2, '0'), true); data3200error = 0; } else { adapter.log.debug("Datenarray3200 unvollständig, keine Werte gesetzt"); data3200error++; } } else { adapter.log.debug("Datensatz3200 unvollständig, keine Werte gesetzt"); data3200error++; } if (data3400error > 4) { adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 3200"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik3200 - Fehler: " + e); } adapter.log.debug("Daten 3200 fertig verarbeitet.") if (pollfunction == true) { pollfunction = false; clientconnection = false; } else { clientconnection = false; } }); } //endcallluxtronik3200 function callluxtronik3400() { clientconnection = true; warteauf = "callluxtronik3400"; var datacount3400 = 0; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; client.write('3400\r\n'); // send data to through the client to the host }); client.on('error', function(ex) { adapter.log.warn("3400 connection error: " + ex); }); client.on('data', function(data) { datastring += data; datacount3400++; if (datastring.includes("3400;9") === true && (datastring.split(';')).length === (parseInt((datastring.split(';'))[1]) + 2)) { datacount3400 = 0; adapter.log.debug("Data complete, destroy connection") client.destroy(); } else if (datacount3400 > 5) { datacount3400 = 0; adapter.log.debug("Data3400 NOT complete, destroy connection") client.destroy(); } }); client.on('close', function() { adapter.log.debug("Connection closed"); adapter.log.debug("Datenset: " + datastring); adapter.log.debug("Anzahl Elemente Datenset: " + datastring.length); try { if (datastring.length > 20) { var data3400array = datastring.split(';'); adapter.log.debug("Anzahl Elemente data3400array: " + data3400array.length); adapter.log.debug("Anzahl Elemente data3400array SOLL: " + (parseInt(data3400array[1]) + 2)); if (data3400array.length == 11) { adapter.log.debug("Datensatz 3400: " + data3400array); adapter.log.debug("Abweichung Rücklauf Soll: " + data3400array[2]); adapter.log.debug("Endpunkt: " + data3400array[3]); adapter.log.debug("Parallelverschiebung: " + data3400array[4]); adapter.log.debug("Nachtabsenkung: " + data3400array[5]); adapter.setState("heizkurve.AbwRLs", data3400array[2] / 10, true); adapter.setState("heizkurve.Endpunkt", data3400array[3] / 10, true); adapter.setState("heizkurve.ParaV", data3400array[4] / 10, true); adapter.setState("heizkurve.NachtAbs", data3400array[5] / 10, true); if (pollfunction == true) { adapter.setState("control.AbwRLs", data3400array[2] / 10, true); adapter.setState("control.EndpunktHK", data3400array[3] / 10, true); adapter.setState("control.ParaVHK", data3400array[4] / 10, true); adapter.setState("control.NachtAbs", data3400array[5] / 10, true); } data3400error = 0; } else { adapter.log.debug("Datenarray3400 unvollständig, keine Werte gesetzt"); data3400error++; } } else { adapter.log.debug("Datensatz3400 unvollständig, keine Werte gesetzt"); data3400error++; } if (data3400error > 4) { adapter.log.warn("Achtung, mehrfach unvollständiger Datensatz 3400"); adapter.log.warn("Adapter wird neu gestartet"); restartAdapter(); } } catch (e) { adapter.log.warn("callluxtronik3400 - Fehler: " + e); } adapter.log.debug("Daten 3400 fertig verarbeitet.") if (hkfunction == true) { hkfunction = false; adapter.log.debug("Heizkurvenfunktion beendet"); } else { clientconnection = false; } if (pollfunction == true) { pollfunction = false; clientconnection = false; } }); } //endcallluxtronik3400 function callluxtronik3401(hkdata) { clientconnection = true; warteauf = "callluxtronik3401"; var client = new net.Socket(); var client = client.connect(port, deviceIpAdress, function() { // write out connection details adapter.log.debug('Connected to Luxtronik'); datastring = ""; errorcount = 0; client.write('3401\r\n'); // send data to through the client to the host setTimeout(function() { client.write(hkdata.toString().replace(/,/g, ';') + '\r\n'); }, 2000); setTimeout(function() { client.write('999\r\n'); }, 4000); }); client.on('error', function(ex) { adapter.log.warn("3401 connection error: " + ex); }); client.on('data', function(data) { datastring += data; try { if (datastring.includes("779") === true && errorcount == 0) { errorcount = 1; adapter.log.warn("Befehlsverarbeitung unvollständig, bitte nochmal starten"); adapter.log.warn("Kommunikationsstörung wird behoben gestartet"); client.write('3401\r\n'); // send data to through the client