Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Daten aus einer Website mit Javascript

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Daten aus einer Website mit Javascript

    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      ArnoD last edited by

      hiasii12 kannst du das Script noch etwas optimieren ?? 😄 😉

      In der Schnittstellenbeschreibung steht "Um die Schnittstelle zuverlässig betreiben zu können, sollte der Abstand zweier Anfragen eine Zeit

      von 15 Sekunden zueinander nicht unterschreiten."

      Das konnte ich bereits auch feststellen, da ich bei weniger als 15 sek. keine Einstellungen mehr mit der Grünbeck APP verändern konnte.

      Ich würde gerne alle Werte in ein Paket packen und alle 15 sek. abfragen, nicht wie jetzt über drei Abfragen verteilt.

      Die Werte für Wasserverbrauch D_Y_2_xx und Zeit letzte Regeneration D_Y_4_xx würden einmal am Tag ausreichen, da sich ja nichts ändert.

      (z.B. immer um 1:00 Uhr in der Nacht)

      Würde es ja selber machen, aber bei der Aufgabe, Werte nur einmal am Tag abfragen, scheitere ich mit meinen Scriptkenntnissen. :?

      So sieht mein View jetzt aus 😄

      10332_2019-01-26_15_05_02-vis.jpg

      Ach ja, wenn jetzt noch jemand weiss wie mann eine manuelle Regeneration über Vis auslösen kann, währe ich happy :mrgreen:

      1 Reply Last reply Reply Quote 0
      • M
        Marc_P last edited by

        Hallo,
        vielleicht kann mir jemand helfen. Ich habe das Problem, dass das Logger-Script nicht läuft.
        Die Datenpunkte wurden durch das erste Script erstellt.
        Wenn ich das Logger-Script starte kommt die Fehlermeldung:

        javascript.0	2019-02-11 16:40:47.957	error	Error in callback: Error: INVALID_STATE_ERR: send flag is true
        

        und

        error	javascript.0 at Object.Interval (script.js.gruenbeck_logger:28:9)
        

        Hat er ein Problem mit der function Interval?

        Hier noch mein komplettes Script:

        // Logger
            // Wichtige Daten hier anpassen
            // V1.0: Erstellung
            // V1.1: Header mit Konstanten hinzu;
            // Verbindungsüberwachung hinzu;
            // V1.2: Datum auslesen entfernt
            // Sommer/Winterzeit auslesen entfernt
            // Hier IP Adresse der Anlage eintragen
            var constIP = "192.168.10.31"
            // Hier Namen der State Variable eintragen wenn Verbindung über Ping Adapter geprüft werden soll
            // Wenn kein Ping Adapter verwendet werden soll dan True eintragen
            var statePingAdapter = 'ping.0.iobroker.192_168_10_31'
            // Hier Abfragezyklus in Sekunden eintragen
            var constTick = 5
            var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
            var parser = require('xmldom').DOMParser;
            var xhr = new XMLHttpRequest();
            var requestNumber = 1 ;
            xhr.onload = function () { };
            xhr.onerror = function () { };
            var varInterval = setInterval(Interval, constTick * 1000 );
            function Interval() {
            var connection = getState(statePingAdapter)
            // console.log(connection.val);
            if (connection.val)
            {
            xhr.open("POST","http://" + constIP + "/mux_http");
            xhr.setRequestHeader("Content-type", "application/json");
            xhr.responseType = "document";
            switch(requestNumber) {
            case 1:
            //console.log('Request ' + requestNumber + ' ausgeführt');
            xhr.send("id=8871&show=D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14~");
            xhr.onreadystatechange = function()
            {
            if (xhr.readyState==4)
            {
            if (xhr.status == 200)
            {
            if (xhr.responseText)
            {
            var str = xhr.responseText;
         const regex = /<data>`([^\<]+)<\/code><d_y_2_1>([^\<]+)<\/D_Y_2_1><d_y_2_2>([^\<]+)<\/D_Y_2_2><d_y_2_3>([^\<]+)<\/D_Y_2_3><d_y_2_4>([^\<]+)<\/D_Y_2_4><d_y_2_5>([^\<]+)<\/D_Y_2_5><d_y_2_6>([^\<]+)<\/D_Y_2_6><d_y_2_7>([^\<]+)<\/D_Y_2_7><d_y_2_8>([^\<]+)<\/D_Y_2_8><d_y_2_9>([^\<]+)<\/D_Y_2_9><d_y_2_10>([^\<]+)<\/D_Y_2_10><d_y_2_11>([^\<]+)<\/D_Y_2_11><d_y_2_12>([^\<]+)<\/D_Y_2_12><d_y_2_13>([^\<]+)<\/D_Y_2_13><d_y_2_14>([^\<]+)<\/D_Y_2_14><\/data>/;
                        const subst = regex.exec(str);
        
                            if (subst)
                            {
                                for ( i = 1; i < 15; i++ ) {
                                    i1 = i + 1;
                                    if (i < 10)
                                    setState("Messwerte.0.SC18.Wasserverbrauch.D_Y_2_0" + i , parseInt(subst[i1]) );
                                    else
                                    setState("Messwerte.0.SC18.Wasserverbrauch.D_Y_2_" + i , parseInt(subst[i1]) );
                                }
        
                            }
                            requestNumber = 2;
                        }
                    }
        		}
        };
        break;
        case 2:
        //console.log('Request ' + requestNumber + ' ausgeführt');
        xhr.send("id=8871&show=D_C_4_1|D_C_4_2|D_C_4_3|D_C_5_1|D_C_7_1~");
        xhr.onreadystatechange = function()
        {
        	if (xhr.readyState==4)
        	{
        		if (xhr.status == 200)
        		{
        			if (xhr.responseText)
        			{
        			    var str = xhr.responseText;
        
                        const regex = /<data>`([^\<]+)<\/code><d_c_4_1>([^\<]+)<\/D_C_4_1><d_c_4_2>([^\<]+)<\/D_C_4_2><d_c_4_3>([^\<]+)<\/D_C_4_3><d_c_5_1>([^\<]+)<\/D_C_5_1><d_c_7_1>([^\<]+)<\/D_C_7_1><\/data>/;
                        const subst = regex.exec(str);
        
                            if (subst)
                            {
                                    setState("Messwerte.0.SC18.Allgemein.D_C_4_1" , parseInt(subst[2]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_C_4_2" , subst[3] );
                                    setState("Messwerte.0.SC18.Allgemein.D_C_4_3" , subst[4] );
                                    setState("Messwerte.0.SC18.Allgemein.D_C_5_1" , parseInt(subst[5]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_C_7_1" , parseInt(subst[6]) );                  
                            }
                            requestNumber = 3;
                        }
                    }
        		}
        };
        break;
        case 3:
        //console.log('Request ' + requestNumber + ' ausgeführt');
        xhr.send("id=8871&show=D_Y_4_1|D_Y_4_2|D_Y_4_3|D_Y_4_4|D_Y_4_5|D_Y_4_6|D_Y_4_7|D_Y_4_8|D_Y_4_9|D_Y_4_10|D_Y_4_11|D_Y_4_12|D_Y_4_13|D_Y_4_14~");
        xhr.onreadystatechange = function()
        {
        	if (xhr.readyState==4)
        	{
        		if (xhr.status == 200)
        		{
        			if (xhr.responseText)
        			{
        			    var str = xhr.responseText;
        
                        const regex = /<data>`([^\<]+)<\/code><d_y_4_1>([^\<]+)<\/D_Y_4_1><d_y_4_2>([^\<]+)<\/D_Y_4_2><d_y_4_3>([^\<]+)<\/D_Y_4_3><d_y_4_4>([^\<]+)<\/D_Y_4_4><d_y_4_5>([^\<]+)<\/D_Y_4_5><d_y_4_6>([^\<]+)<\/D_Y_4_6><d_y_4_7>([^\<]+)<\/D_Y_4_7><d_y_4_8>([^\<]+)<\/D_Y_4_8><d_y_4_9>([^\<]+)<\/D_Y_4_9><d_y_4_10>([^\<]+)<\/D_Y_4_10><d_y_4_11>([^\<]+)<\/D_Y_4_11><d_y_4_12>([^\<]+)<\/D_Y_4_12><d_y_4_13>([^\<]+)<\/D_Y_4_13><d_y_4_14>([^\<]+)<\/D_Y_4_14><\/data>/;
                        const subst = regex.exec(str);
        
                            if (subst)
                            {
                                for ( i = 1; i < 15; i++ ) {
                                    i1 = i + 1;
                                    if (i < 10)
                                    setState("Messwerte.0.SC18.Regenerationen.D_Y_4_0" + i , subst[i1] );
                                    else
                                    setState("Messwerte.0.SC18.Regenerationen.D_Y_4_" + i , subst[i1] );
                                }
                            requestNumber = 4;
                            }
                        }
                    }
        		}
        };
        break;
        case 4:
        //console.log('Request ' + requestNumber + ' ausgeführt');
        xhr.send("id=8871&show=D_Y_5|D_Y_7|D_Y_8_11|D_Y_10_1|D_Y_13|D_Y_14|D_B_1|D_C_5_1~");
        xhr.onreadystatechange = function()
        {
        	if (xhr.readyState==4)
        	{
        		if (xhr.status == 200)
        		{
        			if (xhr.responseText)
        			{
        			    var str = xhr.responseText;
        
                        const regex = /<data>`([^\<]+)<\/code><d_y_5>([^\<]+)<\/D_Y_5><d_y_7>([^\<]+)<\/D_Y_7><d_y_8_11>([^\<]+)<\/D_Y_8_11><d_y_10_1>([^\<]+)<\/D_Y_10_1><d_y_13>([^\<]+)<\/D_Y_13><d_y_14>([^\<]+)<\/D_Y_14><d_b_1>([^\<]+)<\/D_B_1><d_c_5_1>([^\<]+)<\/D_C_5_1><\/data>/;
                        const subst = regex.exec(str);
        
                            if (subst)
                            {
                                    setState("Messwerte.0.SC18.Allgemein.D_Y_5" , parseInt(subst[2]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_Y_7" , subst[3] );
                                    setState("Messwerte.0.SC18.Allgemein.D_Y_8_11" , parseInt(subst[4]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_Y_10_1" , parseInt(subst[5]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_Y_13" , parseInt(subst[6]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_Y_14" , subst[7] );
                                    setState("Messwerte.0.SC18.Allgemein.D_B_1" , parseInt(subst[8]) );
                                    setState("Messwerte.0.SC18.Allgemein.D_C_5_1" , parseInt(subst[9]) );
                            }
                            requestNumber = 5;
                        }
                    }
        		}
        };
        break;
        
        case 5:
        //console.log('Request ' + requestNumber + ' ausgeführt');
        xhr.send("id=8871&show=D_A_1_1|D_A_1_2|D_A_1_3|D_A_2_1|D_A_3_1|D_A_3_2~");
        xhr.onreadystatechange = function()
        {
        	if (xhr.readyState==4)
        	{
        		if (xhr.status == 200)
        		{
        			if (xhr.responseText)
        			{
        			    var str = xhr.responseText;
        
                        const regex = /<data>`([^\<]+)<\/code><d_a_1_1>([^\<]+)<\/D_A_1_1><d_a_1_2>([^\<]+)<\/D_A_1_2><d_a_1_3>([^\<]+)<\/D_A_1_3><d_a_2_1>([^\<]+)<\/D_A_2_1><d_a_3_1>([^\<]+)<\/D_A_3_1><d_a_3_2>([^\<]+)<\/D_A_3_2><\/data>/;
                        const subst = regex.exec(str);
        
                            if (subst)
                            {
                                    setState("Messwerte.0.SC18.Aktualwerte.D_A_1_1" , parseFloat(subst[2]) );
                                    setState("Messwerte.0.SC18.Aktualwerte.D_A_1_2" , parseFloat(subst[3]) );
                                    setState("Messwerte.0.SC18.Aktualwerte.D_A_1_3" , parseFloat(subst[4]) );
                                    setState("Messwerte.0.SC18.Aktualwerte.D_A_2_1" , parseInt(subst[5]) );
                                    setState("Messwerte.0.SC18.Aktualwerte.D_A_3_1" , subst[6] );
                                    setState("Messwerte.0.SC18.Aktualwerte.D_A_3_2" , parseInt(subst[7]) );
                            }
                            requestNumber = 1;
                        }
                    }
        		}
        };
        }
        }
        }
        

        Auch ist mir die folgende Zeile im Original-Script nicht ganz klar:

        var statePingAdapter = 'ping.0.matthias-SS15HT.192_168_0_132'/192 168 0 132/
        

        gehört das /192 168 0 132/ mit dazu oder ist das ein Kommentar?
        Wenn ich das mit reinschreibe, gibt es ein compile error.

        Gruß
        Marc

        1 Reply Last reply Reply Quote 0
        • M
          Marc_P last edited by

          So, der Fehler ist, warum auch immer, verschwunden?!
          Allerdings werden keine Daten in die Objekte geschrieben.
          Ich habe mit console.Log das Script im Betrieb mal überprüft:

          • console.Log(xhr.responseText) enthält die Daten, die mit xhr.send angefragt wurden
          • console.Log(subst) hat aber den Inhalt null. Es scheint so, dass das regex nicht richtig funktioniert oder sehe ich das falsch?

          Wenn ich es auf der Seite regex101.com wie folgt teste, gibt es keine Übereinstimmung:

          REGULAR EXPRESSION

          <data>`([^\<]+)<\/code><d_c_4_1>([^\<]+)<\/D_C_4_1><d_c_4_2>([^\<]+)<\/D_C_4_2><d_c_4_3>([^\<]+)<\/D_C_4_3><d_c_5_1>([^\<]+)<\/D_C_5_1><d_c_7_1>([^\<]+)<\/D_C_7_1><\/data>
          

          TEST STRING

          <data><code>ok</code><D_C_4_1>1</D_C_4_1><D_C_4_2>13:10</D_C_4_2><D_C_4_3>02:00</D_C_4_3><D_C_5_1>0</D_C_5_1><D_C_7_1>365</D_C_7_1></data>
          

          Könnte hier jemand sein Logger-Script einstellen, was bei ihm funktioniert?
          Ich habe es von hier kopiert, aber durch den Seitenumzug ist ja, wie man ganz oben sieht, alles zerschossen und ich bin mir nicht sicher ob mein Script soweit i.O. ist bzw. ob ich es richtig kopiert habe.☹

          Gruß
          Marc

          1 Reply Last reply Reply Quote 0
          • M
            Marc_P last edited by Marc_P

            So, Problem gefunden.
            Durch die Forenumstellung sind die 2 Skripte oben unbrauchbar.

            Hier die 2, die bei mir jetzt einwandfrei laufen:
            statemachine

            // StateMaschine
                var i
                // Wasserverbrauch
                var path = 'Messwerte.0.SC18.Wasserverbrauch.';
                for ( i = 1; i < 15; i++ ) {
                if (i<10)var id = path + 'D_Y_2_0' + i;
                else var id = path + 'D_Y_2_' + i ;
                var obj = {};
                obj.type = 'state';
                obj.common = {};
                obj.common.name = 'Wasserverbrauch vor ' + i + ' Tagen' ;
                obj.common.type = 'number';
                obj.common.role = 'number';
                obj.common.desc = 'Wasserverbrauch vor ' + i + ' Tagen';
                obj.common.read = true;
                obj.common.write = true;
                obj.common.def = 0;
                obj.common.min = 0;
                obj.common.unit = 'Liter';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
                }
                // Regenerationen
                var path = 'Messwerte.0.SC18.Regenerationen.';
            
            for ( i = 1; i < 15; i++ ) {
            if (i<10)var id = path + 'D_Y_4_0' + i;
            else var id = path + 'D_Y_4_' + i ;
            
                var obj = {};
                obj.type = 'state';
                obj.common = {};
                obj.common.name = 'Zeitpunkt Regenereation ' + i + ' vor aktueller';
                obj.common.type = 'string';
                obj.common.role = 'string';
                obj.common.desc = 'Zeitpunkt Regenereation ' + i + ' vor aktueller';
                obj.common.read = true;
                obj.common.write = true;
                obj.common.def = 0;
                obj.common.min = 0;
                obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
                }
            // Allgemeine Felder
            var path = 'Messwerte.0.SC18.Allgemein.';
            var id = path + 'D_C_4_2';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Uhrzeit' ;
            obj.common.type = 'string';
            obj.common.role = 'string';
            obj.common.desc = 'Uhrzeit';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = 'Uhr';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            	
            var id = path + 'D_C_5_1';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Ansprechverhalten' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Ansprechverhalten';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
                  var id = path + 'D_C_4_1';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Regenerationszeitpunkt' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Regenerationszeitpunkt 0= Auto 1= Fest';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_C_4_3';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Startzeit Regeneration' ;
            obj.common.type = 'string';
            obj.common.role = 'string';
            obj.common.desc = 'Startzeit Regeneration';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = 'Uhr';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_C_7_1';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Soll Service Intervalldauer' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Soll Service Intervalldauer';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = 'Tage';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_A_2_2';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Tage bis zur nächsten Wartung' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Tage bis zur nächsten Wartung';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = 'Tage';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_Y_5';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Aktueller Regenerationsschritt 0= keine Regeneration 1= Soletank füllen 2= Besalzen 3= Verdrängen 4= Rückspülen 5= Erstfiltrat' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Aktueller Regenerationsschritt 0= keine Regeneration 1= Soletank füllen 2= Besalzen 3= Verdrängen 4= Rückspülen 5= Erstfiltrat';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_Y_7';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Inbetriebnahme-Datum' ;
            obj.common.type = 'string';
            obj.common.role = 'string';
            obj.common.desc = 'Inbetriebnahme-Datum';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_Y_8_11';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Ergebnis letzter E-Mail Versand 0=keine Mail versandt 1=Mail erfolgreich versandt 2=Benutzerdaten fehlerhaft 3= kein Internetzugang/Server nicht bereit' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Ergebnis letzter E-Mail Versand 0=keine Mail versandt 1=Mail erfolgreich versandt 2=Benutzerdaten fehlerhaft 3= kein Internetzugang/Server nicht bereit';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_Y_10_1';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Aktuelle Restkapazität Austauscher' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Aktuelle Restkapazität Austauscher';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '%';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_Y_13';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = '0= Austauscher gestört/in Regeneration 1= Austauscher in Betrieb' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = '0= Austauscher gestört/in Regeneration 1= Austauscher in Betrieb';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            var id = path + 'D_Y_14';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Voraussichtliche nächste Regeneration' ;
            obj.common.type = 'string';
            obj.common.role = 'string';
            obj.common.desc = 'Voraussichtliche nächste Regeneration';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            //region D_B_1 Regeneration
            var id = path + 'D_B_1';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Regeneration aktiv' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Regeneration aktiv';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            // Aktualwerte
            var path = 'Messwerte.0.SC18.Aktualwerte.';
            
                //region D_A_1_1
                var id = path + 'D_A_1_1';
                var obj = {};
                obj.type = 'state';
                obj.common = {};
                obj.common.name = 'Aktueller Durchfluss' ;
                obj.common.type = 'number';
                obj.common.role = 'number';
                obj.common.desc = 'Aktueller Durchfluss';
                obj.common.read = true;
                obj.common.write = true;
                obj.common.def = 0;
                obj.common.min = 0;
                obj.common.unit = 'm³/h';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            //endregion D_A_1_1
            
                //region D_A_1_2
                var id = path + 'D_A_1_2';
                var obj = {};
                obj.type = 'state';
                obj.common = {};
                obj.common.name = 'Restkapazität' ;
                obj.common.type = 'number';
                obj.common.role = 'number';
                obj.common.desc = 'Restkapazität';
                obj.common.read = true;
                obj.common.write = true;
                obj.common.def = 0;
                obj.common.min = 0;
                obj.common.unit = 'm³*°dH';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            //endregion
            
            //region D_A_1_3
            var id = path + 'D_A_1_3';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Kapazitätszahl' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Kapazitätszahl';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = 'm³*°dH';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
                //endregion
                //region D_A_2_1
                var id = path + 'D_A_2_1';
                var obj = {};
                obj.type = 'state';
                obj.common = {};
                obj.common.name = 'Restzeit/-menge Reg.Schritt' ;
                obj.common.type = 'number';
                obj.common.role = 'number';
                obj.common.desc = 'Restzeit/-menge Reg.Schritt';
                obj.common.read = true;
                obj.common.write = true;
                obj.common.def = 0;
                obj.common.min = 0;
                obj.common.unit = 'l oder min';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
                //endregion
                //region D_A_3_1
                var id = path + 'D_A_3_1';
                var obj = {};
                obj.type = 'state';
                obj.common = {};
                obj.common.name = 'Letzte Regeneration' ;
                obj.common.type = 'string';
                obj.common.role = 'string';
                obj.common.desc = 'Letzte Regeneration vor x h';
                obj.common.read = true;
                obj.common.write = true;
                obj.common.def = 0;
                obj.common.min = 0;
                obj.common.unit = 'h';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            
            //endregion
            
                //region D_A_3_2
            var id = path + 'D_A_3_2';
            var obj = {};
            obj.type = 'state';
            obj.common = {};
            obj.common.name = 'Letzte Regeneration Über' ;
            obj.common.type = 'number';
            obj.common.role = 'number';
            obj.common.desc = 'Letzte Regeneration Über';
            obj.common.read = true;
            obj.common.write = true;
            obj.common.def = 0;
            obj.common.min = 0;
            obj.common.unit = '%';
            
            setObject(id, obj, function(err) {
                if(err) log('Cannot write object: ' + err);
                else setState(id, obj.common.def);
            });
            //endregion
            

            logger

            	// Logger
                // Wichtige Daten hier anpassen
                // V1.0: Erstellung
                // V1.1: Header mit Konstanten hinzu;
                // Verbindungsüberwachung hinzu;
                // V1.2: Datum auslesen entfernt
                // Sommer/Winterzeit auslesen entfernt
                // Hier IP Adresse der Anlage eintragen
                var constIP = "192.168.10.31"
                // Hier Namen der State Variable eintragen wenn Verbindung über Ping Adapter geprüft werden soll
                // Wenn kein Ping Adapter verwendet werden soll dan True eintragen
                var statePingAdapter = 'ping.0.iobroker.192_168_10_31'
                // Hier Abfragezyklus in Sekunden eintragen
                var constTick = 15
                var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
                var parser = require('xmldom').DOMParser;
                var xhr = new XMLHttpRequest();
                var requestNumber = 1 ;
                xhr.onload = function () { };
                xhr.onerror = function () { };
                var varInterval = setInterval(Interval, constTick * 1000 );
                function Interval() {
                var connection = getState(statePingAdapter);
                // console.log(connection.val);
                if (connection.val)
                {
                xhr.open("POST","http://" + constIP + "/mux_http");
                xhr.setRequestHeader("Content-type", "application/json");
                xhr.responseType = "document";
                switch(requestNumber) {
            case 1:
            console.log('Grünbeck: Request ' + requestNumber + ' ausgeführt');
            xhr.send("id=8871&show=D_Y_2_1|D_Y_2_2|D_Y_2_3|D_Y_2_4|D_Y_2_5|D_Y_2_6|D_Y_2_7|D_Y_2_8|D_Y_2_9|D_Y_2_10|D_Y_2_11|D_Y_2_12|D_Y_2_13|D_Y_2_14~");
            xhr.onreadystatechange = function()
            {
            	if (xhr.readyState==4)
                {
            		if (xhr.status == 200)
            		{
            			if (xhr.responseText)
            			{
            				var str = xhr.responseText;
            				const regex = /<data><code>([^\<]+)<\/code><D_Y_2_1>([^\<]+)<\/D_Y_2_1><D_Y_2_2>([^\<]+)<\/D_Y_2_2><D_Y_2_3>([^\<]+)<\/D_Y_2_3><D_Y_2_4>([^\<]+)<\/D_Y_2_4><D_Y_2_5>([^\<]+)<\/D_Y_2_5><D_Y_2_6>([^\<]+)<\/D_Y_2_6><D_Y_2_7>([^\<]+)<\/D_Y_2_7><D_Y_2_8>([^\<]+)<\/D_Y_2_8><D_Y_2_9>([^\<]+)<\/D_Y_2_9><D_Y_2_10>([^\<]+)<\/D_Y_2_10><D_Y_2_11>([^\<]+)<\/D_Y_2_11><D_Y_2_12>([^\<]+)<\/D_Y_2_12><D_Y_2_13>([^\<]+)<\/D_Y_2_13><D_Y_2_14>([^\<]+)<\/D_Y_2_14><\/data>/;
                            const subst = regex.exec(str);
            
                                if (subst)
                                {
                                    for ( i = 1; i < 15; i++ ) {
                                        i1 = i + 1;
                                        if (i < 10)
                                        setState("Messwerte.0.SC18.Wasserverbrauch.D_Y_2_0" + i , parseInt(subst[i1]) );
                                        else
                                        setState("Messwerte.0.SC18.Wasserverbrauch.D_Y_2_" + i , parseInt(subst[i1]) );
                                    }
            
                                }
                                requestNumber = 2;
                            }
                        }
            		}
            };
            break;
            case 2:
            console.log('Grünbeck: Request ' + requestNumber + ' ausgeführt');
            xhr.send("id=8871&show=D_C_4_1|D_C_4_2|D_C_4_3|D_C_5_1|D_C_7_1~");
            xhr.onreadystatechange = function()
            {
            	if (xhr.readyState==4)
            	{
            		if (xhr.status == 200)
            		{
            			if (xhr.responseText)
            			{
            			    var str = xhr.responseText;
                            const regex = /<data><code>([^\<]+)<\/code><D_C_4_1>([^\<]+)<\/D_C_4_1><D_C_4_2>([^\<]+)<\/D_C_4_2><D_C_4_3>([^\<]+)<\/D_C_4_3><D_C_5_1>([^\<]+)<\/D_C_5_1><D_C_7_1>([^\<]+)<\/D_C_7_1><\/data>/;
                            const subst = regex.exec(str);
            
                                if (subst)
                                {
                                        setState("Messwerte.0.SC18.Allgemein.D_C_4_1" , parseInt(subst[2]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_C_4_2" , subst[3] );
                                        setState("Messwerte.0.SC18.Allgemein.D_C_4_3" , subst[4] );
                                        setState("Messwerte.0.SC18.Allgemein.D_C_5_1" , parseInt(subst[5]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_C_7_1" , parseInt(subst[6]) );                  
                                }
                                requestNumber = 3;
                            }
                        }
            		}
            };
            break;
            case 3:
            console.log('Grünbeck: Request ' + requestNumber + ' ausgeführt');
            xhr.send("id=8871&show=D_Y_4_1|D_Y_4_2|D_Y_4_3|D_Y_4_4|D_Y_4_5|D_Y_4_6|D_Y_4_7|D_Y_4_8|D_Y_4_9|D_Y_4_10|D_Y_4_11|D_Y_4_12|D_Y_4_13|D_Y_4_14~");
            xhr.onreadystatechange = function()
            {
            	if (xhr.readyState==4)
            	{
            		if (xhr.status == 200)
            		{
            			if (xhr.responseText)
            			{
            			    var str = xhr.responseText;
                            const regex = /<data><code>([^\<]+)<\/code><D_Y_4_1>([^\<]+)<\/D_Y_4_1><D_Y_4_2>([^\<]+)<\/D_Y_4_2><D_Y_4_3>([^\<]+)<\/D_Y_4_3><D_Y_4_4>([^\<]+)<\/D_Y_4_4><D_Y_4_5>([^\<]+)<\/D_Y_4_5><D_Y_4_6>([^\<]+)<\/D_Y_4_6><D_Y_4_7>([^\<]+)<\/D_Y_4_7><D_Y_4_8>([^\<]+)<\/D_Y_4_8><D_Y_4_9>([^\<]+)<\/D_Y_4_9><D_Y_4_10>([^\<]+)<\/D_Y_4_10><D_Y_4_11>([^\<]+)<\/D_Y_4_11><D_Y_4_12>([^\<]+)<\/D_Y_4_12><D_Y_4_13>([^\<]+)<\/D_Y_4_13><D_Y_4_14>([^\<]+)<\/D_Y_4_14><\/data>/;
                            const subst = regex.exec(str);
            
                                if (subst)
                                {
                                    for ( i = 1; i < 15; i++ ) {
                                        i1 = i + 1;
                                        if (i < 10)
                                        setState("Messwerte.0.SC18.Regenerationen.D_Y_4_0" + i , subst[i1] );
                                        else
                                        setState("Messwerte.0.SC18.Regenerationen.D_Y_4_" + i , subst[i1] );
                                    }
                                requestNumber = 4;
                                }
                            }
                        }
            		}
            };
            break;
            case 4:
            console.log('Grünbeck: Request ' + requestNumber + ' ausgeführt');
            xhr.send("id=8871&show=D_Y_5|D_Y_7|D_Y_8_11|D_Y_10_1|D_Y_13|D_Y_14|D_B_1|D_C_5_1~");
            xhr.onreadystatechange = function()
            {
            	if (xhr.readyState==4)
            	{
            		if (xhr.status == 200)
            		{
            			if (xhr.responseText)
            			{
            			    var str = xhr.responseText;
                            const regex = /<data><code>([^\<]+)<\/code><D_Y_5>([^\<]+)<\/D_Y_5><D_Y_7>([^\<]+)<\/D_Y_7><D_Y_8_11>([^\<]+)<\/D_Y_8_11><D_Y_10_1>([^\<]+)<\/D_Y_10_1><D_Y_13>([^\<]+)<\/D_Y_13><D_Y_14>([^\<]+)<\/D_Y_14><D_B_1>([^\<]+)<\/D_B_1><D_C_5_1>([^\<]+)<\/D_C_5_1><\/data>/;
                            const subst = regex.exec(str);
            
                                if (subst)
                                {
                                        setState("Messwerte.0.SC18.Allgemein.D_Y_5" , parseInt(subst[2]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_Y_7" , subst[3] );
                                        setState("Messwerte.0.SC18.Allgemein.D_Y_8_11" , parseInt(subst[4]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_Y_10_1" , parseInt(subst[5]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_Y_13" , parseInt(subst[6]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_Y_14" , subst[7] );
                                        setState("Messwerte.0.SC18.Allgemein.D_B_1" , parseInt(subst[8]) );
                                        setState("Messwerte.0.SC18.Allgemein.D_C_5_1" , parseInt(subst[9]) );
                                }
                                requestNumber = 5;
                            }
                        }
            		}
            };
            break;
            
            case 5:
            console.log('Grünbeck: Request ' + requestNumber + ' ausgeführt');
            xhr.send("id=8871&show=D_A_1_1|D_A_1_2|D_A_1_3|D_A_2_1|D_A_3_1|D_A_3_2~");
            xhr.onreadystatechange = function()
            {
            	if (xhr.readyState==4)
            	{
            		if (xhr.status == 200)
            		{
            			if (xhr.responseText)
            			{
            			    var str = xhr.responseText;
                            const regex = /<data><code>([^\<]+)<\/code><D_A_1_1>([^\<]+)<\/D_A_1_1><D_A_1_2>([^\<]+)<\/D_A_1_2><D_A_1_3>([^\<]+)<\/D_A_1_3><D_A_2_1>([^\<]+)<\/D_A_2_1><D_A_3_1>([^\<]+)<\/D_A_3_1><D_A_3_2>([^\<]+)<\/D_A_3_2><\/data>/;
                            const subst = regex.exec(str);
            
                                if (subst)
                                {
                                        setState("Messwerte.0.SC18.Aktualwerte.D_A_1_1" , parseFloat(subst[2]) );
                                        setState("Messwerte.0.SC18.Aktualwerte.D_A_1_2" , parseFloat(subst[3]) );
                                        setState("Messwerte.0.SC18.Aktualwerte.D_A_1_3" , parseFloat(subst[4]) );
                                        setState("Messwerte.0.SC18.Aktualwerte.D_A_2_1" , parseInt(subst[5]) );
                                        setState("Messwerte.0.SC18.Aktualwerte.D_A_3_1" , subst[6] );
                                        setState("Messwerte.0.SC18.Aktualwerte.D_A_3_2" , parseInt(subst[7]) );
                                }
                                requestNumber = 1;
                            }
                        }
            		}
            };
            }
            }
            }
            

            Gruß
            Marc

            1 Reply Last reply Reply Quote 0
            • smartboart
              smartboart @hiasii12 last edited by smartboart

              danke fürs wieder einstellen.
              Ob das Script auch bei der nächst groesseren anlage funktioniert? Weis das jemand die SC23.

              1 Reply Last reply Reply Quote 0
              • M
                Marc_P last edited by Marc_P

                Hm, leider wohl etwas zu früh gefreut.
                Manchmal (eigentlich "recht oft") kommt bei der Aktualisierung, egal ob Request 1, 2, 3, 4 oder 5 die folgende Fehlermeldung:

                javascript.0	2019-02-13 15:31:53.460	error	at Timer.listOnTimeout (timers.js:290:5)
                javascript.0	2019-02-13 15:31:53.460	error	at tryOnTimeout (timers.js:323:5)
                javascript.0	2019-02-13 15:31:53.460	error	at ontimeout (timers.js:511:34)
                javascript.0	2019-02-13 15:31:53.460	error	at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1815:34)
                javascript.0	2019-02-13 15:31:53.459	error	at Object.Interval (script.js.gruenbeck_logger:28:9)
                javascript.0	2019-02-13 15:31:53.459	error	at exports.XMLHttpRequest.setRequestHeader (/opt/iobroker/node_modules/iobroker.javascript/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:201:13)
                javascript.0	2019-02-13 15:31:53.459	error	Error in callback: Error: INVALID_STATE_ERR: send flag is true
                javascript.0	2019-02-13 15:31:48.456	info	script.js.gruenbeck_logger: Grünbeck: Request 1 ausgeführt
                

                Er versucht dann den Request so oft, bis er den abarbeiten konnte und den Request-Zähler intern erhöht. Dann macht er weiter.
                Scheint ja irgendein Timout Problem zu sein.
                Gibt es eine Möglichkeit, irgendwo ein Timeout einzustellen? Oder liegt das Problem wo anders?
                Alternativ: Gibt es eine Möglichkeit für dieses Script die Log-Ausgabe von error zu unterbinden? Das macht das Log völlig unübersichtlich.☹

                Gruß
                Marc

                1 Reply Last reply Reply Quote 0
                • AlCalzone
                  AlCalzone Developer last edited by

                  Das Problem liegt so wie ich das sehe, dass versucht wird, die XMLHttpRequest-Instanz während eines laufenden Sendevorgangs zu modifizieren.

                  Ich hätte einen anderen Vorschlag: Nutze statt XMLHttpRequest eine etwas komfortablere Library wie das bereits im JS-Adapter integrierte https://github.com/request/request

                  Die macht das ganze Status-Handling deutlich einfacher.

                  1 Reply Last reply Reply Quote 0
                  • M
                    Marc_P last edited by

                    Müsste ich mir näher anschauen. Kennst Du dich mit request etwas aus?
                    Habe mal versucht, Daten von der Grünbeck zu empfangen, was aber leider wohl so nicht funktioniert?!

                    const request = require('request');
                    request.post({
                        headers: {'Content-Type': 'application/json'},
                        url: 'http://192.168.10.31/mux_http',
                        body: 'id=8871&show=D_Y_2_1~'
                    }, function (err, res, body) {
                        console.log('err:' + err);
                        console.log('res:' + res);
                        console.log('body:' + body);
                      });
                    

                    Als Ausgabe kommt nur:

                    info	javascript.0 script.js.test: registered 0 subscriptions and 0 schedules
                    info	javascript.0 script.js.test: err:null
                    info	javascript.0 script.js.test: res:[object Object]
                    info	javascript.0 script.js.test: body:<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"xml:lang="en" lang="en"> <head> <title>Error</title> </head> <body> <b>400 Bad Request: No Host Header</b> <br/> /mux_http <br/> </body> </html> 
                    

                    Gruß
                    Marc

                    AlCalzone 1 Reply Last reply Reply Quote 0
                    • AlCalzone
                      AlCalzone Developer @Marc_P last edited by

                      @Marc_P sagte in Daten aus einer Website mit Javascript:

                      400 Bad Request: No Host Header

                      Das hab ich selbst noch nicht erlebt, aber versuche mal host: "192.168.10.31" manuell zu den Headern hinzuzufügen.

                      1 Reply Last reply Reply Quote 0
                      • M
                        Marc_P last edited by

                        Ne, funktioniert leider auch nicht. Gleiche Meldung.
                        Ich habe auch schon gefühlt halb google nach einer Lösung durchsucht.

                        Bin jetzt aber auch nicht wirklich so der Programmierer.☹

                        1 Reply Last reply Reply Quote 0
                        • M
                          Marc_P last edited by

                          Noch mal abschließend:
                          Die Nutzung von request lege ich zur Seite, denn das Script mit xmlhhtprequest läuft jetzt ohne Fehler.
                          Meine Vermutung:
                          Während das Script vorgestern ja erst lief, habe ich parallel andere Abfragen gemacht. Die Webseite der Grünbeck war im Forefox offen, dann noch ein Test mit dem Firefox-Plugin HTTP Request Maker und die Android App war auch noch auf. Scheinbar war das das Problem. Zumindest seit gestern Nachmittag läuft das Script mit alleiniger Nutzung ohne Fehler durch. Den Abfrageintervall habe ich auf 15 Sekunden gestellt.

                          smartboart 1 Reply Last reply Reply Quote 0
                          • smartboart
                            smartboart @Marc_P last edited by

                            @Marc_P Ok gut zu wissen, habe mir den gruenbeck nämlich schon bestellt.

                            1 Reply Last reply Reply Quote 0
                            • A
                              ArnoD last edited by ArnoD

                              
                              
                              1 Reply Last reply Reply Quote 0
                              • A
                                ArnoD last edited by ArnoD

                                Hatte mal wieder etwas Zeit und habe das Script von hiasii12 etwas umgebaut und optimiert.
                                Hoffe du bist nicht sauer deswegen 😉

                                Änderungen:

                                • Die Werte der SC18 werden alle 15 sek. abgefragt, bis auf Wasserverbrauch und Regenerationen diese werden immer
                                  um 00:00 Uhr abgefragt.
                                • Habe den Pfad geändert auf javascript.0.Gruenbeck.SC18 um bei mir eine bessere Übersicht zu haben, was mit JS programmiert
                                  wurde und zwischen der SC und MC zu unterscheiden (MC mache ich erst, wenn alles problemlos läuft). Wer den alten Pfad
                                  haben will, muss das im Bereich User Anpassungen im Script ändern.
                                • Power- Eco- Modus umschaltung über Vis integriert
                                • Die einzelnen Pfade werden jetzt beim Start angelegt so das nur noch ein Script benötigt wird und das Script State entfällt.

                                Habe das jetzt zwei Tage gestestet und es läuft bei mir ohne Fehler ☺

                                Geplante Änderungen:

                                • Problem lösen, das bei kürzeren Abfragen hintereinander, der Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" auftritt.
                                • Möglichkeit zum Starten der manuellen Regeneration
                                • Vor dem Request prüfen, ob die SC18 online ist (ohne Ping).
                                • Automatische Unterscheidung zwischen SC und MC um die richtigen Werte abzufragen.
                                • Theoretische Berechnung vom Salzverbrauch integrieren, um eine ungefähre Anzeige in Vis zu ermöglichen.

                                Es kann natürlich jeder noch Vorschläge machen und sich auch bei der Lösung beteiligen. 😀
                                Meine Programmierkenntnise in JS, sind schon ziemlich eingerostet, sodas es bei mir etwas länger dauert.

                                smartboart 1 Reply Last reply Reply Quote 0
                                • smartboart
                                  smartboart @ArnoD last edited by smartboart

                                  @ArnoD finde ich klasse das du hier weiter machst. Mit der Ablage der states war ich auch nicht ganz zufrieden. Wegen der Alarmmelung ohne ping haette ich ne Idee... Hier müssten einfach die abgerufenen states überwacht werden. Wenn nach einer festgelegten Zeit x keine aktualisierung erfolgt kann davon ausgegangen werden das es verbindungsprobleme gibt.

                                  1 Reply Last reply Reply Quote 0
                                  • smartboart
                                    smartboart last edited by smartboart

                                    Ansonsten ueber wache ich ohnehin sämtliche Hardware im Netzwerk mit einem separaten Script mittels enum Funktion z. B WLAN geraete welche ich mittels tr64 Adapter Abfrage...Bei Abwesenheit gibt's ne push Nachricht mit der entsprechenden Meldung mit Verweis auf das Geraet
                                    Screenshot_20190222_171453_net.iobroker.vis.jpg

                                    1 Reply Last reply Reply Quote 0
                                    • A
                                      ArnoD last edited by ArnoD

                                      @smartboart werde deine Idee aufgreifen. Werd mal ein paar Versuche machen, was da sinnvoll ist. Entweder die Zeit der Anlage oder der Status WLAN von der Anlage. 🤔

                                      Änderungen:

                                      • alle Werte von der Schnittstellenbeschreibung, die möglich sind bzw. eine sinnvolle Rückmeldung bei der SC18 liefern, hinzugefügt.
                                      • Der Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" sollte jetzt nicht mehr auftreten.
                                        Ich würde aber mit den Abfragezyklen nicht unter 15 sek. gehen, da sonst eine Steuerung über die App nicht mehr möglich ist.
                                        Die Antwortzeiten der SC18 ligt bei meinem Netzwerk bei 1,5 bis 4,5 sek. so das Abfragen unter 15 sek. wirklich nichts mehr bringen. Ich habe bei mir die Zeit auf 60 sek. eingestellt und ist für mich auch völlig ausreichend.

                                      Sollte jemand das erste Script bereits gestestet haben, dann vorher den Pfad "Gruenbeck" löschen so das alle states wieder neu angelegt werden.

                                      Geplante Änderungen:

                                      • Möglichkeit zum Starten der manuellen Regeneration
                                      • Vor dem Request prüfen, ob die SC18 online ist (ohne Ping).
                                      • Automatische Unterscheidung zwischen SC und MC um die richtigen Werte abzufragen.
                                      • Theoretische Berechnung vom Salzverbrauch integrieren, um eine ungefähre Anzeige in Vis zu ermöglichen.

                                      Über Rückmeldungen würde ich mich natürlich wie immer freuen.

                                      /************************************************************************
                                      Version: 1.6.1  - Nächster Versuch den Fehler "send flag true" abzufangen :-)
                                                      - State Salzverbrauch gesamt
                                      Version: 1.6.0  - Formel zum berechnen vom Salzverbrauch
                                                      - State Salzverbrauch in kg
                                      Version: 1.5.1  - Optimierung manuelle Regeneration von smartboart übernommen.
                                      Version: 1.5.0  - Neu State für das auslesen vom Fehlerspeicher hinzugefügt.
                                                      - zweiter send Befehl nach Änderung vom D_B_1 State unterbunden.
                                      Version: 1.4.2  - Auslösen einer manuelle Regeneration ist jetzt über Vis möglich
                                                      - State D_Y_6 für die Softwareversion hinzugefügt.
                                      Version: 1.4.1  - Fehler "send flag is true" beseitigt.
                                                      - Fehler in der Zeitsynchronisation beseitigt.
                                                      - State D_C_5_2 und D_D_2 und D_Y_8_10 entfernt (ohne Funktion bei SC18)
                                      Version: 1.4.0  - Fehler "send flag is true" sollte nur noch bei manuellen State Änderungen <18 Sek. auftreten.
                                      Version: 1.3.0  - Automatische Zeit Synchronisation wenn Regenerationszeitpunkt auf "1=fest" eingestellt ist
                                                      - Bei Änderung der Werte Ansprechverhalten,Regenerationszeitpunkt,Regenerationszeit wird
                                                        die Änderung an die SC18 gesendet. 
                                                      - Parameter C_C_5_3 Automatische Umschaltung Sommer-/Winterzeit entfernt (ohne Funktion bei SC18)
                                      
                                      Version: 1.2.2 - Konstante für Abfragezyklus eingefügt
                                      Version: 1.2.1 - Timeout Variable eingefügt
                                      Version: 1.2.0 - Änderung:Nur noch eine Abfrage wo alle Werte abgefragt werden.
                                      Version: 1.1.0 - Fehler korrigiert das bei kürzeren Abfragen der Fehler "Error in callback: Error: INVALID_STATE_ERR: send flag is true" auftritt.
                                                     - Alle Werte der Schnittstellenbeschreibung, die sinnvoll bei der SC18 abgefragt werden können, hinzugefügt.
                                      Version: 1.0.0 - Erstellung Script nach Vorlage  hiasii12
                                      *************************************************************************/
                                      
                                      // ++++++++++ USER ANPASSUNGEN ++++++++++++++++++++++
                                      
                                      // Hier IP Adresse der Anlage eintragen 
                                      var constIP = "192.168.1.230"
                                      // Hier Anlagen Typ eintragen SC18, SC23, MC32, MC38 (aktuelle geht nur SC18)
                                      var sTyp = "SC18" 
                                      // Instanz eintragen
                                      var instance    = '0';
                                      var instanz     = 'javascript.' + instance + '.';
                                      // Pfad innerhalb der Instanz
                                      var PfadEbene1 = 'Gruenbeck.SC18.';
                                      // Abfragezyklus in Sekunden eintragen ( <10 sek. sind nicht zu empfehlen)
                                      const constPollingCycle = 30
                                      // nur zur Fehleranalyse
                                      var debug = false;
                                      //++++++++++ ENDE USER ANPASSUNGEN ++++++++++++++++++
                                      var PfadEbene2 = ['Parameter.', 'Allgemein.','Netzwerk.','Fehlerspeicher.','Aktualwerte.','Wasserverbrauch.','Regenerationen.', 'Ausseneingriff.']
                                      
                                      // erstelle States
                                      if (sTyp == 'SC18') {
                                          // Parameter mit Schreib- und Lesezugriff
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_D_1', {def: 0,name: 'Rohwasserhärte',type: 'number',role: 'number',desc: 'Rohwasserhärte',unit: '°dH'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_A_4_1', {def: "-",name: 'Name Installateur',type: 'string',role: 'string',desc: 'Name Installateur',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_A_4_2', {def: "-",name: 'Tel Installateur',type: 'string',role: 'string',desc: 'Tel Installateur',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_A_4_3', {def: "-",name: 'E-Mail Installateur',type: 'string',role: 'string',desc: 'E-Mail Installateur',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_1_1', {def: 0,name: 'Sprache 0=De 1=En 3=Fr 4=Nl 5=Ru 6=Es 7=Zh',type: 'number',role: 'number',desc: 'Sprache 0=De 1=En 3=Fr 4=Nl 5=Ru 6=Es 7=Zh',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_2_1', {def: 0,name: 'Haerteeinheit 0=°dH 1=°f 2=°e 3=ppm 4=mol/m³',type: 'number',role: 'number',desc: 'Haerteeinheit 0=°dH 1=°f 2=°e 3=ppm 4=mol/m³',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_5_1', {def: 0,name: 'Ansprechverhalten 0=eco 1=Power',type: 'number',role: 'number',desc: 'Ansprechverhalten 0=eco 1=Power',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_4_1', {def: 0,name: 'Regenerationszeitpunkt 0= Auto 1= Fest',type: 'number',role: 'number',desc: 'Regenerationszeitpunkt 0= Auto 1= Fest',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_4_2', {def: "00:00",name: 'Uhrzeit',type: 'string',role: 'string',desc: 'Uhrzeit',unit: 'Uhr'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_4_3', {def: "00:00",name: 'Startzeit Regeneration 1',type: 'string',role: 'string',desc: 'Startzeit Regeneration 1',unit: 'Uhr'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_6_1', {def: 0,name: 'Aktives Display im Standby 0=deaktiviert 1=aktiviert',type: 'number',role: 'number',desc: 'Aktives Display im Standby 0=deaktiviert 1=aktiviert',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_C_7_1', {def: 0,name: 'Soll Service Intervalldauer',type: 'number',role: 'number',desc: 'Soll Service Intervalldauer',unit: 'Tage'});
                                          // Allgemein Parameter mit Lesezugriff
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_A_2_2', {def: 0,name: 'Tage bis zur nächsten Wartung',type: 'number',role: 'number',desc: 'Tage bis zur nächsten Wartung',unit: 'Tage'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_5', {def: 0,name: 'Aktueller Regenerationsschritt 0= keine Regeneration 1= Soletank füllen 2= Besalzen 3= Verdrängen 4= Rückspülen 5= Erstfiltrat',type: 'number',role: 'number',desc: 'Aktueller Regenerationsschritt 0= keine Regeneration 1= Soletank füllen 2= Besalzen 3= Verdrängen 4= Rückspülen 5= Erstfiltrat',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_7', {def: "--.--.--",name: 'Inbetriebnahme-Datum',type: 'string',role: 'string',desc: 'Inbetriebnahme-Datum',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_6', {def: "-",name: 'sw_version',type: 'string',role: 'string',desc: 'sw_version',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_8_11', {def: 0,name: 'Ergebnis letzter E-Mail Versand 0=keine Mail versandt 1=Mail erfolgreich versandt 2=Benutzerdaten fehlerhaft 3= kein Internetzugang/Server nicht bereit',type: 'number',role: 'number',desc: 'Ergebnis letzter E-Mail Versand 0=keine Mail versandt 1=Mail erfolgreich versandt 2=Benutzerdaten fehlerhaft 3= kein Internetzugang/Server nicht bereit',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_Y_10_1', {def: 0,name: 'Aktuelle Restkapazität Austauscher',type: 'number',role: 'number',desc: 'Aktuelle Restkapazität Austauscher',unit: '%'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[1] + 'D_B_1', {def: 0,name: 'Regeneration aktiv',type: 'number',role: 'number',desc: 'Regeneration aktiv',unit: ''});
                                          //Netzwerk
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_1', {def: "-",name: 'IP-Adresse WLAN',type: 'string',role: 'string',desc: 'IP-Adresse WLAN',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_2', {def: "-",name: 'Default Gateway WLAN',type: 'string',role: 'string',desc: 'Default Gateway WLAN',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_3', {def: "-",name: 'Primary DNS WLAN',type: 'string',role: 'string',desc: 'Primary DNS WLAN',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_4', {def: "-",name: 'Secondary DNS WLAN',type: 'string',role: 'string',desc: 'Secondary DNS WLAN',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_6_5', {def: 0,name: 'Status WLAN 1=verbunden',type: 'number',role: 'number',desc: 'Status WLAN 1=verbunden',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_7_1', {def: "-",name: 'IP-Adresse Access Point',type: 'string',role: 'string',desc: 'IP-Adresse Access Point',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_7_2', {def: "-",name: 'SSID Access Point',type: 'string',role: 'string',desc: 'SSID Access Point',unit: ''});
                                          createState(instanz + PfadEbene1 + PfadEbene2[2] + 'D_C_3_7_3', {def: 0,name: 'Status Access Point 1=verbunden',type: 'number',role: 'number',desc: 'Status Access Point 1=verbunden',unit: ''});
                                          
                                          //Fehlerspeicher
                                          for(var i = 1; i<= 16; i++) {
                                      	    if(i<10){
                                      		    createState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_0' + i, {def: "-",name: 'Fehlerspeicher ' + i ,type: 'string',role: 'string',desc: 'Fehlerspeicher ' + i ,unit: ''});
                                      	    }
                                      	    else {
                                      		    createState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_' + i, {def: "-",name: 'Fehlerspeicher ' + i ,type: 'string',role: 'string',desc: 'Fehlerspeicher ' + i ,unit: ''});	
                                      	    }
                                          }
                                          //**** Aktualwerte ***
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_1', {def: 0,name: 'Aktueller Durchfluss',type: 'number',role: 'number',desc: 'Aktueller Durchfluss',unit: 'm³/h'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_2', {def: 0,name: 'Restkapazität',type: 'number',role: 'number',desc: 'Restkapazität',unit: 'm³*°dH'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_3', {def: 0,name: 'Kapazitätszahl',type: 'number',role: 'number',desc: 'Kapazitätszahl',unit: 'm³*°dH'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_2_1', {def: 0,name: 'Restzeit/-menge Reg.Schritt',type: 'number',role: 'number',desc: 'Restzeit/-menge Reg.Schritt',unit: 'l oder min'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_3_1', {def: "-",name: 'Letzte Regeneration',type: 'string',role: 'string',desc: 'Letzte Regeneration',unit: 'h'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_3_2', {def: 0,name: 'Letzte Regeneration über',type: 'number',role: 'number',desc: 'Letzte Regeneration über',unit: '%'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch', {def: 0, name: 'Salzverbrauch in kg',type: 'number',role: 'number',desc: 'Salzverbrauch in kg',unit: 'kg'});
                                          createState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt', {def: 0, name: 'Salzverbrauch gesamt in kg',type: 'number',role: 'number',desc: 'Salzverbrauch gesamt in kg',unit: 'kg'});
                                          //**** Wasserverbrauch *** Regenerationen ***
                                          for(var i = 1; i<= 14; i++) {
                                      	    if(i<10){
                                      		    createState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_0' + i, {def: 0,name: 'Wasserverbrauch vor ' + i + 'Tagen',type: 'number',role: 'number',desc: 'Wasserverbrauch vor ' + i + ' Tagen',unit: 'Liter'});
                                      		    createState(instanz + PfadEbene1 + PfadEbene2[6] + 'D_Y_4_0' + i, {def: "-",name: 'Zeit letzte Regenereation ' + i + ' vor aktueller',type: 'string',role: 'string',desc: 'Zeit letzte Regenereation ' + i + ' vor aktueller',unit: ''});
                                      	    }
                                      	    else {
                                      		    createState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_' + i, {def: 0,name: 'Wasserverbrauch vor ' + i + 'Tagen',type: 'number',role: 'number',desc: 'Wasserverbrauch vor ' + i + ' Tagen',unit: 'Liter'});
                                      		    createState(instanz + PfadEbene1 + PfadEbene2[6] + 'D_Y_4_' + i, {def: "-",name: 'Zeit letzte Regenereation ' + i + ' vor aktueller',type: 'string',role: 'string',desc: 'Zeit letzte Regenereation ' + i + ' vor aktueller',unit: ''});	
                                      	    }
                                          }
                                          //*** Ausseneingriff ******
                                          createState(instanz + PfadEbene1 + PfadEbene2[7] + 'Fehlerspeicher' , {def:'false',name:'Fehlerspeicher ' ,type:'boolean',role:'State',desc: 'State zum auslesen vom Fehlerspeicher '});
                                          createState(instanz + PfadEbene1 + PfadEbene2[7] + 'Regenerationsstart', {def:'false',name:'Regenerationsstart',type:'boolean',role:'State',desc: 'State zum starten der Regeneration'});     
                                      };
                                      //*************************************************************************************************
                                      var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
                                      var parser = require('xmldom').DOMParser;
                                      var xhr = new XMLHttpRequest();
                                      var StatePfad = "";
                                      var Parameter;
                                      var sParSend = "";
                                      var sParGet = "";
                                      var neuerWert;
                                      var arryPfadEbene2;
                                      var KeineRueckmeldung = false;
                                      var TimeoutRueckmeldung;
                                      // Regenerationsstart von Vis
                                      const idRegStart = instanz + PfadEbene1 + PfadEbene2[7] + 'Regenerationsstart';
                                      // Regenerationsstart von SC18
                                      const idReg = instanz + PfadEbene1 + PfadEbene2[1] + 'D_B_1';
                                      
                                      //**************************************************************************************************
                                      /*xhr.onerror = function () 
                                      {
                                          console.error ("Es ist ein Fehler aufgetreten")
                                          console.error ("Status Text ist: " + xhr.statusText)
                                          if (xhr.statusText == "Error: connect EHOSTUNREACH 192.168.1.230:80" || xhr.statusText == "Error: connect ETIMEDOUT 192.168.1.230:80")
                                          {
                                              console.error("Keine W-Lan Verbindung zur SC18")
                                              ShowState (sParSend)
                                          }
                                      };*/
                                      
                                      
                                      //wird aufgerufen wenn Sendevorgang erfolgreich abgeschlossen wurde
                                      xhr.onload = function () 
                                      {
                                          if (debug) {console.log("Rueckmeldung SC18:" + xhr.responseText)}
                                          var str = xhr.responseText;
                                          switch (arryPfadEbene2)
                                          {
                                              case 0:
                                              case 1:
                                              case 2:
                                              case 4:
                                              case 5: 
                                              case 6:    
                                              regex = /<data><code>([^\<]+)<\/code><D_D_1>([^\<]+)<\/D_D_1><D_A_4_1>([^\<]+)<\/D_A_4_1><D_A_4_2>([^\<]+)<\/D_A_4_2><D_A_4_3>([^\<]+)<\/D_A_4_3><D_C_1_1>([^\<]+)<\/D_C_1_1><D_C_2_1>([^\<]+)<\/D_C_2_1><D_C_5_1>([^\<]+)<\/D_C_5_1><D_C_4_1>([^\<]+)<\/D_C_4_1><D_C_4_2>([^\<]+)<\/D_C_4_2><D_C_4_3>([^\<]+)<\/D_C_4_3><D_C_6_1>([^\<]+)<\/D_C_6_1><D_C_7_1>([^\<]+)<\/D_C_7_1><D_A_2_2>([^\<]+)<\/D_A_2_2><D_C_3_6_1>([^\<]+)<\/D_C_3_6_1><D_C_3_6_2>([^\<]+)<\/D_C_3_6_2><D_C_3_6_3>([^\<]+)<\/D_C_3_6_3><D_C_3_6_4>([^\<]+)<\/D_C_3_6_4><D_C_3_6_5>([^\<]+)<\/D_C_3_6_5><D_C_3_7_1>([^\<]+)<\/D_C_3_7_1><D_C_3_7_2>([^\<]+)<\/D_C_3_7_2><D_C_3_7_3>([^\<]+)<\/D_C_3_7_3><D_Y_5>([^\<]+)<\/D_Y_5><D_Y_7>([^\<]+)<\/D_Y_7><D_Y_6>([^\<]+)<\/D_Y_6><D_Y_8_11>([^\<]+)<\/D_Y_8_11><D_Y_10_1>([^\<]+)<\/D_Y_10_1><D_B_1>([^\<]+)<\/D_B_1><D_A_1_1>([^\<]+)<\/D_A_1_1><D_A_1_2>([^\<]+)<\/D_A_1_2><D_A_1_3>([^\<]+)<\/D_A_1_3><D_A_2_1>([^\<]+)<\/D_A_2_1><D_A_3_1>([^\<]+)<\/D_A_3_1><D_A_3_2>([^\<]+)<\/D_A_3_2><D_Y_2_1>([^\<]+)<\/D_Y_2_1><D_Y_4_1>([^\<]+)<\/D_Y_4_1><D_Y_2_2>([^\<]+)<\/D_Y_2_2><D_Y_4_2>([^\<]+)<\/D_Y_4_2><D_Y_2_3>([^\<]+)<\/D_Y_2_3><D_Y_4_3>([^\<]+)<\/D_Y_4_3><D_Y_2_4>([^\<]+)<\/D_Y_2_4><D_Y_4_4>([^\<]+)<\/D_Y_4_4><D_Y_2_5>([^\<]+)<\/D_Y_2_5><D_Y_4_5>([^\<]+)<\/D_Y_4_5><D_Y_2_6>([^\<]+)<\/D_Y_2_6><D_Y_4_6>([^\<]+)<\/D_Y_4_6><D_Y_2_7>([^\<]+)<\/D_Y_2_7><D_Y_4_7>([^\<]+)<\/D_Y_4_7><D_Y_2_8>([^\<]+)<\/D_Y_2_8><D_Y_4_8>([^\<]+)<\/D_Y_4_8><D_Y_2_9>([^\<]+)<\/D_Y_2_9><D_Y_4_9>([^\<]+)<\/D_Y_4_9><D_Y_2_10>([^\<]+)<\/D_Y_2_10><D_Y_4_10>([^\<]+)<\/D_Y_4_10><D_Y_2_11>([^\<]+)<\/D_Y_2_11><D_Y_4_11>([^\<]+)<\/D_Y_4_11><D_Y_2_12>([^\<]+)<\/D_Y_2_12><D_Y_4_12>([^\<]+)<\/D_Y_4_12><D_Y_2_13>([^\<]+)<\/D_Y_2_13><D_Y_4_13>([^\<]+)<\/D_Y_4_13><D_Y_2_14>([^\<]+)<\/D_Y_2_14><D_Y_4_14>([^\<]+)<\/D_Y_4_14><\/data>/;
                                      	    subst = regex.exec(str);
                                              if (subst)
                                      	    {
                                      		    var i = 2;
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_D_1' , parseFloat(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_A_4_1' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_A_4_2' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_A_4_3' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_1_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_2_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_5_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_4_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_4_2' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_4_3' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_6_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Parameter.D_C_7_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_A_2_2' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_1' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_2' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_3' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_4' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_6_5' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_7_1' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_7_2' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Netzwerk.D_C_3_7_3' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_Y_5' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_Y_7' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_Y_6' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_Y_8_11' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_Y_10_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Allgemein.D_B_1' , parseInt(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_1_1' , parseFloat(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_1_2' , parseFloat(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_1_3' , parseFloat(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_2_1' , parseFloat(subst[i++]) );
                                                  setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_3_1' , subst[i++] );
                                                  setState(instanz + PfadEbene1 + 'Aktualwerte.D_A_3_2' , parseInt(subst[i]) );
                                                  var iz = i;
                                      		    for(var iw = 1; iw<= 14; iw++) 
                                                  {
                                      			    iz++;
                                      			    if(iw<10)
                                                      {
                                      				    setState(instanz + PfadEbene1 + 'Wasserverbrauch.D_Y_2_0' + iw , parseInt(subst[iz++]) );
                                      				    setState(instanz + PfadEbene1 + 'Regenerationen.D_Y_4_0' + iw , subst[iz] );
                                                      }
                                      			    else 
                                                      {
                                      				    setState(instanz + PfadEbene1 + 'Wasserverbrauch.D_Y_2_' + iw , parseInt(subst[iz++]) );
                                      				    setState(instanz + PfadEbene1 + 'Regenerationen.D_Y_4_' + iw , subst[iz] );
                                      			    }
                                                  }
                                              }
                                              break;
                                              case 3:
                                              regex = /<data><code>([^\<]+)<\/code><D_K_10_1>([^\<]+)<\/D_K_10_1><D_K_10_2>([^\<]+)<\/D_K_10_2><D_K_10_3>([^\<]+)<\/D_K_10_3><D_K_10_4>([^\<]+)<\/D_K_10_4><D_K_10_5>([^\<]+)<\/D_K_10_5><D_K_10_6>([^\<]+)<\/D_K_10_6><D_K_10_7>([^\<]+)<\/D_K_10_7><D_K_10_8>([^\<]+)<\/D_K_10_8><D_K_10_9>([^\<]+)<\/D_K_10_9><D_K_10_10>([^\<]+)<\/D_K_10_10><D_K_10_11>([^\<]+)<\/D_K_10_11><D_K_10_12>([^\<]+)<\/D_K_10_12><D_K_10_13>([^\<]+)<\/D_K_10_13><D_K_10_14>([^\<]+)<\/D_K_10_14><D_K_10_15>([^\<]+)<\/D_K_10_15><D_K_10_16>([^\<]+)<\/D_K_10_16><\/data>/;
                                              subst = regex.exec(str);
                                              if (subst)
                                      	    {
                                      		    var iz = 2
                                                  for(var iw = 1; iw<= 16; iw++) 
                                                  {
                                      			    
                                                      if(iw<10)
                                                      {
                                      				    setState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_0'+ iw , subst[iz] );
                                                      }
                                      			    else 
                                                      {
                                      				    setState(instanz + PfadEbene1 + PfadEbene2[3] + 'D_K_10_'+ iw , subst[iz] );
                                      			    }
                                                      iz++;
                                                  }
                                              }
                                              break;
                                              default:
                                          }
                                      };
                                      
                                      // State SC18 String erstellen für Zyklisch abfragen
                                      on({time: "*/" + constPollingCycle + " * * * * *"}, function () {
                                      	if (KeineRueckmeldung == false){
                                              sParSend = "id=3369&show=D_D_1|D_A_4_1|D_A_4_2|D_A_4_3|D_C_1_1|D_C_2_1|D_C_5_1|D_C_4_1|D_C_4_2|D_C_4_3|D_C_6_1|D_C_7_1|D_A_2_2|D_C_3_6_1|D_C_3_6_2|D_C_3_6_3|D_C_3_6_4|D_C_3_6_5|D_C_3_7_1|D_C_3_7_2|D_C_3_7_3|D_Y_5|D_Y_7|D_Y_6|D_Y_8_11|D_Y_10_1|D_B_1|D_A_1_1|D_A_1_2|D_A_1_3|D_A_2_1|D_A_3_1|D_A_3_2|D_Y_2_1|D_Y_4_1|D_Y_2_2|D_Y_4_2|D_Y_2_3|D_Y_4_3|D_Y_2_4|D_Y_4_4|D_Y_2_5|D_Y_4_5|D_Y_2_6|D_Y_4_6|D_Y_2_7|D_Y_4_7|D_Y_2_8|D_Y_4_8|D_Y_2_9|D_Y_4_9|D_Y_2_10|D_Y_4_10|D_Y_2_11|D_Y_4_11|D_Y_2_12|D_Y_4_12|D_Y_2_13|D_Y_4_13|D_Y_2_14|D_Y_4_14~"
                                              ShowState (sParSend)
                                              arryPfadEbene2 = 0  
                                          } 
                                      });
                                      
                                      //Power- Eco-modus umschalten Int 0=eco 1=power
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_5_1', function (obj) 
                                      {
                                          if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_5_1').val;
                                              if (neuerWert == 1 || neuerWert == 0){ 
                                                  ShowState ("edit=D_C_5_1>"+neuerWert+"&id=3369~")
                                              }
                                          }
                                      });
                                      
                                      //Regenerationszeitpunkt Int 0=auto 1=fest
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_1', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_1').val;
                                              if (neuerWert == 1 || neuerWert == 0){ 
                                                  ShowState ("edit=D_C_4_1>"+neuerWert+"&id=3369~")
                                              }
                                          }
                                      });
                                      
                                      //Uhrzeit String hh:mm wird automatisch Synchronisiert wenn Regenerationszeitpunkt auf "1=fest" eingestellt ist
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_2', function (obj) 
                                      {
                                          if (KeineRueckmeldung == false){
                                              var sZeitState = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_2').val;
                                              var minutes = new Date();
                                              var Minuten = minutes.getMinutes(); Minuten = Minuten > 9 ? Minuten : '0' + Minuten; 
                                              var akkZeit = new Date().getHours()+":"+Minuten;
                                              // wenn Regenerationszeitpunkt = 1 (fest) und aktuelle Zeit nicht gleich Anlagenzeit
                                              if (getState(instanz + PfadEbene1 +PfadEbene2[0]+'D_C_4_1').val && akkZeit != sZeitState ){
                                                  ShowState ("edit=D_C_4_2>"+ akkZeit +"&id=3369~")
                                              }
                                          }
                                      });
                                      
                                      //Startzeit Regeneration String hh:mm
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_3', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_4_3').val;
                                              ShowState ("edit=D_C_4_3>"+neuerWert+"&id=3369~")
                                          }   
                                      });
                                      
                                      //Rohwasserhärte Double °dH
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_D_1', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_D_1').val;
                                              ShowState ("edit=D_D_1>"+neuerWert+"&id=3369~")
                                          }
                                      });
                                      
                                      //Sprache Int 0=De 1=En 3=Fr 4=Nl 5=Ru 6=Es 7=Zh
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_1_1', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_1_1').val;
                                              ShowState ("edit=D_C_1_1>"+neuerWert+"&id=3369~")
                                          }
                                      });
                                      
                                      //Aktives Display im Standby Int 0=deaktiviert 1=aktiviert
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_6_1', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_6_1').val;
                                              if (neuerWert == 1 || neuerWert == 0){
                                                 ShowState ("edit=D_C_6_1>"+neuerWert+"&id=3369~")
                                              }
                                          }
                                      });
                                      
                                      //Soll Service Intervalldauer Int Tage
                                      on(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_7_1', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[0]+'D_C_6_1').val;
                                              if (neuerWert >= 0 && neuerWert <= 4){
                                                  ShowState ("edit=D_C_7_1>"+neuerWert+"&id=3369~")
                                              }
                                          } 
                                      });
                                      
                                      //manuelle Regeneration Int 1=Start
                                      on({id:idRegStart,val:true,change:'ne'}, function (obj){
                                         if (KeineRueckmeldung == false){
                                              var Regeneration = getState(idReg).val;
                                              var Trigger = getState(idRegStart).val;
                                              setStateDelayed(idRegStart,false,1*1000);
                                              if (Regeneration === 0 && Trigger === true){
                                                 ShowState ("edit=D_B_1>1&id=3369~")
                                              }else{
                                      	        if (debug) {console.log('Regeneration bereits aktiv')}
                                              } 
                                          }
                                      });
                                      
                                      //Fehlerspeicher Int 1=abfragen
                                      on(instanz+PfadEbene1+PfadEbene2[7]+'Fehlerspeicher', function (obj) 
                                      {
                                         if (KeineRueckmeldung == false){
                                              neuerWert = getState(instanz + PfadEbene1 + PfadEbene2[7]+'Fehlerspeicher').val;
                                              if (neuerWert == 1){
                                                  sParSend = "id=3369&code=245&show=D_K_10_1|D_K_10_2|D_K_10_3|D_K_10_4|D_K_10_5|D_K_10_6|D_K_10_7|D_K_10_8|D_K_10_9|D_K_10_10|D_K_10_11|D_K_10_12|D_K_10_13|D_K_10_14|D_K_10_15|D_K_10_16~"
                                                  ShowState (sParSend)
                                                  arryPfadEbene2 = 3; 
                                                  setState(instanz + PfadEbene1 + PfadEbene2[7]+'Fehlerspeicher',false);
                                              }
                                          } 
                                      });
                                      
                                      // aktuelle State SC18 abrufen
                                      function ShowState (sParSend) 
                                      {
                                          if (KeineRueckmeldung == false)
                                          {
                                              if(typeof(sParSend) == "undefined")sParSend = "";
                                      		xhr.open("POST","http://" + constIP + "/mux_http", true);
                                      	    xhr.setRequestHeader("Content-type", "application/json");
                                      	    xhr.setRequestHeader("Content-length", sParSend.length);
                                      		xhr.setRequestHeader("Connection", "close");
                                      		xhr.responseType = "document";
                                              if (KeineRueckmeldung == false){
                                                  xhr.send(sParSend);
                                                  if (debug) {console.log (sParSend.length + " Byte an Daten wurden gesendet :" + sParSend)}
                                              }
                                              KeineRueckmeldung = true;
                                              TimeoutRueckmeldung = setInterval(function(){timeout_Rueckmeldung();} , 4000);
                                      		xhr.onreadystatechange = function()
                                      		{
                                      				if (xhr.readyState==4)
                                      				{
                                      					clearInterval(TimeoutRueckmeldung);
                                      					KeineRueckmeldung = false;
                                      				}
                                      			
                                      		}
                                      		
                                          }	
                                          else {return}
                                      }
                                      
                                      //Bei Timeout abbrechen
                                      function timeout_Rueckmeldung()
                                      {
                                      	KeineRueckmeldung = false;
                                      	xhr.abort();
                                      	clearInterval(TimeoutRueckmeldung);
                                          if (debug) {console.log("Timeout")}
                                      }
                                      
                                      
                                      // Salzverbrauch berechnen 
                                      on(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_01', function (obj){ 
                                      /*Formel Grünbeck bei Kapazitätszahl 8 m³x°dH und einem Härteunterschied von Rohwasser zu Brauchwasser 
                                        von 12 °dH  : 0,0285 kg x 12 °dH x 100 m³ = 34,2 kg Regeneriersalz
                                              Bei der min. Kapazitätszahl 6 m³x°dH entspricht der Salzverbrauch 0.025 kg
                                              Bei der max. Kapazitätszahl 14 m³x°dH entspricht der Salzverbrauch 0.039 kg
                                              Es wird von einem liniaren Salzverbrauch von 0.00175 kg pro m³x°dH ausgegangen.
                                              (((Kapazitätszahl-6)*0.00175)+0.025)x Rohwasserhärte x (Wasserverbrauch/1000)
                                      */
                                      var Rohwasserhaerte = getState(instanz + PfadEbene1 + PfadEbene2[0] + 'D_D_1').val;
                                      var KapZahl = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'D_A_1_3').val;
                                      var Wasserverbrauch = getState(instanz + PfadEbene1 + PfadEbene2[5] + 'D_Y_2_01').val;
                                      var SalzverbrauchAlt = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch').val;
                                      var SalzverbrauchGesamt = getState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt').val;
                                      var SalzverbrauchNeu = (((KapZahl-6)*0.00175)+ 0.025)*Rohwasserhaerte*(Wasserverbrauch/1000)
                                      SalzverbrauchNeu = SalzverbrauchNeu+SalzverbrauchAlt;
                                      SalzverbrauchGesamt =SalzverbrauchGesamt+SalzverbrauchNeu;
                                      setState(instanz + PfadEbene1 + PfadEbene2[4] + 'Salzverbrauch',SalzverbrauchNeu);
                                      setState(instanz + PfadEbene1 + PfadEbene2[4] + 'SalzverbrauchGesamt',SalzverbrauchGesamt);
                                      
                                      if (debug) {console.log(SalzverbrauchAlt +" : "+ SalzverbrauchNeu)}
                                      
                                      });
                                      
                                      
                                      
                                      smartboart 1 Reply Last reply Reply Quote 0
                                      • smartboart
                                        smartboart last edited by

                                        Super ich hoffe bald testen zu können... Meine Anlage haette eigentlich am Sa schon geliefert werden sollen... Hoffe sie kommt dann Anfang der Woche..

                                        1 Reply Last reply Reply Quote 0
                                        • smartboart
                                          smartboart last edited by smartboart

                                          Mir ist noch was kleines eingefallen..Wie schaut es mit nem Urlaubsmodus aus...Evtl. kann man ja noch ein state für vis hinzufügen / Urlaub, welches als Bedingung für den Datenabruf true sein muss, sodass wenn die anlage während des Urlaubs still gesetzt bzw. ausgeschaltet wird, keine Fehler im log auftauchen...Ich mache das generell mit meinen Scripten so, dass ich immer zwischen automatik und manuell umschalten kann..In diesem Fall wäre es halt ein Urlaubsmodus, welcher wenn aktiv den Schedule /über clear Schedule deaktiviert...Nur so ne idee...

                                          1 Reply Last reply Reply Quote 0
                                          • A
                                            ArnoD last edited by

                                            Das gibt es doch schon 😀
                                            Schau mal bei den Objekten unter Javascript.0.scriptEnabled.common.Gruenbeck dort den State auf "false" ändern, damit wird das script angehalten und mit "true" wieder gestartet. 😉

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            668
                                            Online

                                            31.7k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            16
                                            138
                                            19886
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo