Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Heizkreisregelungen - JS

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Heizkreisregelungen - JS

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

      Du hast die Datenpunkte unter javascript.0.scriptEnabled erstellt. Das solltest Du ändern !

      Erstelle die Datenpunkte direkt unter javascript.0. Beispiel: Name "Heizung.Stellsignal-HK-OG" entspricht ID "javascript.0.Heizung.Stellsignal-HK-OG".

      > Stimmt der Datenpunkt zum Stellsignal so? (Bild 2)
      Nein, der Datenpunkt muss vom Typ "Zahl" mit min: 0, max: 100 und unit: "%" sein.

      1 Reply Last reply Reply Quote 0
      • S
        sound31 last edited by

        In den Script's für die Fußbodenheizung habe ich jetzt jeweils eine Variable

        für die Anforderung der Pumpe gesetzt:

        var pump = "javascript.0.FBH-Pumpe-1"/*FBH-Pumpe-1*/;
        
        

        diese wird mit den Ventilen eingeschalten.

        Danach ein Script für die Pumpeneinschaltung:

        // Ansteuerung Pumpe
        // für Fußbodenheizungen
        
        var pump1 = "javascript.0.FBH-Pumpe-1"/*FBH-Pumpe-1*/;
        var pump2 = "javascript.0.FBH-Pumpe-2"/*FBH-Pumpe-2*/;
        var pump = "knx.0.Aktoren.Heizung-Technik.HK-Verteiler_EG_-_Relais_1"/*HK-EG-Pumpe*/;
        
        function control() {
            if (pump1 == 1 || pump2 == 1)
            {
                setState(pump, 1);
            }
            else if (pump1 === 0 && pump2 === 0)
            {
                setState(pump, 0);
            }
        } 
        
        

        Ich hoffe das ist so korrekt.

        Die Datenpunkte habe ich so angelegt:
        4002_screenshot.20.jpg
        4002_screenshot.21.jpg

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

          @sound31:

          Ich hoffe das ist so korrekt. `
          Leider nicht. Die Pumpen-Datenpunkte sollten vom Typ "boolean" (Logikwert oder Schalter) sein. Das Skript funktioniert so nicht.

          // Ansteuerung Pumpe
          // für Fußbodenheizungen
          
          var idpump1 = "javascript.0.FBH-Pumpe-1"/*FBH-Pumpe-1*/;
          var idpump2 = "javascript.0.FBH-Pumpe-2"/*FBH-Pumpe-2*/;
          var idpump = "knx.0.Aktoren.Heizung-Technik.HK-Verteiler_EG_-_Relais_1"/*HK-EG-Pumpe*/;
          
          // Initialisierung bei Skriptstart
          var pump1 = getState(idpump1).val;
          var pump2 = getState(idpump2).val;
          
          function control() {
              if (pump1 || pump2)
              {
                  setState(idpump, true);
              }
              else
              {
                  setState(idpump, false);
              }
          }
          
          // Skriptstart
          control();
          
          // Auf Änderung von Pumpe1 reagieren
          on(idpump1, function(dp) {
              pump1 = dp.state.val;
              control();
          });
          
          // Auf Änderung von Pumpe 2 reagieren
          on(idpump2, function(dp) {
              pump2 = dp.state.val;
              control();
          });
          
          
          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            Anmerkung: Die Trägheit der thermoelektrischen Stellantriebe (brauchen ca. 5 Minuten für gesamten Hub) sollte beachtet werden. Die Pumpe sollte also mit ca. 3 Minuten Verzögerung gaschaltet werden.

            var timer = null;
            
            function control() {
                if(timer) clearTimeout(timer);
                if (pump1 || pump2) {
                    timer = setTimeout(function() {
                        setState(idpump, true);
                    }, 180000);  // 3 Minuten Verzögerung
                }
                else {
                    timer = setTimeout(function() {
                        setState(idpump, false);
                    }, 180000);    
               }
            }
            
            1 Reply Last reply Reply Quote 0
            • S
              sound31 last edited by

              Stimmt die Schaltung im Script FBH so?

              // PI-Regler Fussbodenheizung mit PWM-Ansteuerung
              // für FBH Flur EG
              // P-Band in K, Nachstellzeit in s, PWM-Periode in Intervallen (Minuten)
              var Xp = 2;
              var Tn = 3600;
              var pwm = 100; //* PWM Zeit verlängert
              
              var xid = "knx.0.Sensoren.Erdgeschoss.Temp-Sensor_Küche_EG"/*Temp-Sensor Küche EG*/;
              var wid = "javascript.0.Sollwert-Küche-EG"/*Sollwert-Küche-EG*/;
              var yid = "knx.0.Aktoren.Heizung-Technik.HK-Verteiler_EG_-_Solid_Stade_Relais_1"/*SSR-Küche-EG*/;
              var pump = "javascript.0.FBH-Pumpe-2"/*FBH-Pumpe-2*/;
              var n = 0;  // Intervallzähler
              
              var  PI = require('pi-controller');
              
              var pi = new PI(Xp, Tn); 
              pi.setOutputMax(pwm);   // default: OutputMax = 100
              
              // Abfrage für Sommer/Winter noch einfugen
              
              function control() {
                var x = getState(xid).val;    // Istwert in °C
                var w = getState(wid).val;    // Sollwert in °C
                var y = pi.Control(w - x);    // Stellsignal
                n++;
                if (n >= pwm) n = 0;
                 if (n < 8 && y > 0)           // Mindesteinschaltdauer: 8 Intervalle
                  {   setState(yid, 1);
                      setState(pump, 1);		// Pumpe Einschalten
                  }
                else if (n >= 8 && y <= n)    // Zwei Ventile werden geschalten
                  {   setState(yid, 0);
                      setState(pump, 0);		// Pumpe Ausschalten
                  }  
              }
              
              control();  // Script start
              
              setInterval(control, 60000 );  // Intervall: 1 Minute
              
              
              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                Die Intervall-Zeit solltest Du auf die Hälfte verringern.

                setInterval(control, 30000 );  // Intervall: 0,5 Minuten
                

                Die Datenpunkte zur Pumpenanforderung werden nicht benötigt, denn im Pumpenskript können die Ventildatenpunkte direkt ausgewertet werden (schalten identisch).

                Sind die KNX-Schalt-Datenpunkte vom Typ "boolean" mit den Werten false/true oder sind sie vom Typ Zahl mit den Werten 0/1 ?

                1 Reply Last reply Reply Quote 0
                • S
                  sound31 last edited by

                  Die Datenpunkte sind Logikwert, switch so wurden sie eingelesen vom

                  KNX Adapter.
                  4002_screenshot.13.jpg
                  deswegen habe ich die Ursprünglichen Werte true/false auf 0/1 geändert.

                  Am WE möchte ich nochmal alle Datenpunkte von der KNX-seite prüfen um

                  sicher zu gehen das auch alle richtig angezeigt werden.

                  1 Reply Last reply Reply Quote 0
                  • S
                    sound31 last edited by

                    > Die Datenpunkte zur Pumpenanforderung werden nicht benötigt, denn im Pumpenskript können die Ventildatenpunkte direkt ausgewertet werden (schalten identisch).
                    müsste ich dann im Pumpenscript nicht die ID's der Ventile bei den Variablen einfügen

                    var idpump1 = "javascript.0.FBH-Pumpe-1"/*FBH-Pumpe-1*/;
                    var idpump2 = "javascript.0.FBH-Pumpe-2"/*FBH-Pumpe-2*/;
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 last edited by

                      @sound31:

                      Die Datenpunkte sind Logikwert, switch so wurden sie eingelesen vom KNX Adapter. `
                      Logikwert und min: 0, max: 1 sind ein Widerspruch. Diesbezüglich wurde der Adapter schlampig programmiert. Dann kommt es darauf an, auf welche Werte reagiert wird.
                      @sound31:

                      müsste ich dann im Pumpenscript nicht die ID's der Ventile bei den Variablen einfügen `
                      Richtig.

                      1 Reply Last reply Reply Quote 0
                      • S
                        sound31 last edited by

                        > Logikwert und min: 0, max: 1 sind ein Widerspruch. Diesbezüglich wurde der Adapter schlampig programmiert. Dann kommt es darauf an, auf welche Werte reagiert wird.
                        Sollte ich das in den Einstellungen ändern, Die Ventile und auch die Pumpen werden richtig geschalten.

                        Dann kann ich im FBH-Script die Declaration der Variablen und auch das Ein und Ausschalten dieser entfernen.

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

                          @sound31:

                          Sollte ich das in den Einstellungen ändern, `
                          Nein - auch wenn es nicht korrekt ist - die Datenpunkteigenschaften werden vom Adapter erzeugt.
                          @sound31:

                          Die Ventile und auch die Pumpen werden richtig geschalten. `
                          Mit 0/1 ?

                          @sound31:

                          Dann kann ich im FBH-Script die Declaration der Variablen und auch das Ein und Ausschalten dieser entfernen. `
                          Ja.

                          1 Reply Last reply Reply Quote 0
                          • S
                            sound31 last edited by

                            Hallo Paul53,

                            gibt es eine einfache Möglichkeit in die Scripte eine Stop Funktion einzufügen bei

                            zB. Service?

                            Aktuell hatte es mit die Heizkreispumpe am Donnerstag zerlegt um am Samstag

                            in der früh das Heizregister der Gastherme.

                            Das Script für den Mischermotor tut auch bereits Ihren Dienst.

                            Allerdings sind manchmal beide Ausgänge angesprochen.

                            Grüße, Andy.

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

                              @sound31:

                              gibt es eine einfache Möglichkeit in die Scripte eine Stop Funktion einzufügen bei zB. Service? `
                              Was soll erreicht werden ?

                              Was meinst Du mit Service ?

                              1 Reply Last reply Reply Quote 0
                              • S
                                sound31 last edited by

                                Heute bekomme ich das neue Register für die Gastherme.

                                zum einbauen muss ich das Wasser zum Teil aus dem Heizkreis entfernen.

                                Dazu muss ich die Pumpe auch ausschalten das geht jetzt nur über

                                das ausschalten des Scrips oder Stromlos machen.

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

                                  @sound31:

                                  Dazu muss ich die Pumpe auch ausschalten das geht jetzt nur über das ausschalten des Scrips oder Stromlos machen. `
                                  Stromlos machen ist keine schlechte Lösung. Jedes Skript lässt sich auch im Reiter "Javascript" deaktivieren und nach dem Deaktivieren des Skripts kann man den Datenpunkt für die Pumpe im Reiter "Objekte" auf "Aus" ändern.

                                  Du solltest noch einen Datenpunkt "Heizperiode" oder "Jahreszeit" (Winter = true) vom Typ "Schalter" unter javascript.0 anlegen und darüber die Mischeransteuerung und die Pumpenansteuerung beeinflussen.

                                  const idHeizen = 'javascript.0.Heizperiode';
                                  
                                  ...
                                  var heizen = getState(idHeizen).val;
                                  
                                  function control() {
                                      if(timer) clearTimeout(timer);
                                      if ((pump1 || pump2) && heizen) {
                                         ...
                                  }
                                  
                                  // am Ende zusätzlich
                                  on(idHeizen, function(dp) {
                                      heizen = dp.state.val;
                                      control();
                                  });    
                                  
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 last edited by

                                    @sound31:

                                    Das Script für den Mischermotor tut auch bereits Ihren Dienst. `
                                    Welche Laufzeit hast Du ermittelt ?

                                    @sound31:

                                    Allerdings sind manchmal beide Ausgänge angesprochen. `
                                    Das sollte die Bedingung

                                       if(!motor) {
                                    
                                    

                                    eigentlich verhindern.

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      sound31 last edited by

                                      Hallo,
                                      > Du solltest noch einen Datenpunkt "Heizperiode" oder "Jahreszeit" (Winter = true) vom Typ "Schalter" unter javascript.0 anlegen und darüber die Mischeransteuerung und die Pumpenansteuerung beeinflussen.
                                      das würde heissen das nur die Pumpen abgeschalten werden und die Ventile und der Mischer weiter (auch im Sommer)

                                      fahren würden.

                                      Bei einer reinen Außentemperatur gesteuerte Abschaltung würde die Heizung auch zu laufen beginnen wenn die

                                      Raumtemperaturen im Sommer mal unter den Sollwert sinken würde.
                                      > Welche Laufzeit hast Du ermittelt ?
                                      Von komplett "Geschlossen" bis "Offen" sind es 110sec.

                                      Frage zur Mischeransteuerung:

                                      Da ich die Pumpe für den HK im OG ja auf eine Elektronische ändern muss, die die ich jetzt verbaut habe

                                      ist nicht passen für Heizkörperbetrieb (ist halt ein altes Haus).

                                      Sollte ich diese dauern laufen lassen oder über eine Anforderung aus dem Script heraus.

                                      Grüße, Andy

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

                                        @sound31:

                                        das würde heissen das nur die Pumpen abgeschalten werden und die Ventile und der Mischer weiter (auch im Sommer)

                                        fahren würden. `
                                        Nein, der Datenpunkt "Heizperiode" sollte auch bei der Ventil- und Mischeransteuerung ausgewertet werden.
                                        @sound31:

                                        Sollte ich diese dauern laufen lassen oder über eine Anforderung aus dem Script heraus. `
                                        Da die Pumpe selbst auf eine sehr geringe Leistung runter regelt, würde ich sie nur im Sommer (Datenpunkt "Heizperiode")abschalten.

                                        Im Sommer sollte ein Wartungslauf gegen das Festsitzen ergänzt werden: Pumpen täglich 1 Minute ein, FBH-Ventile wöchentlich 5 Minuten auf; bei der FBH erst die Pumpe, danach die Ventile.

                                        1 Reply Last reply Reply Quote 0
                                        • S
                                          sound31 last edited by

                                          Denn Datenpunkt Heizperiode habe ich auch ins Script der FBH geschrieben

                                          danach schaut das so aus:

                                          var Xp = 2;
                                          var Tn = 3600;
                                          var pwm = 100; //* PWM Zeit verlängert
                                          const idHeizen = "javascript.0.Heizperiode"/*Heizperiode*/;
                                          var xid = "knx.0.Sensoren.Erdgeschoss.Temp-Sensor-Kueche-EG"/*Temp-Sensor-Kueche-EG*/;
                                          var wid = "javascript.0.Sollwert-Küche-EG"/*Sollwert-Küche-EG*/;
                                          var yid = "knx.0.Aktoren.Heizung-Technik.Ventil-FBH-Kueche-EG"/*Ventil-FBH-Kueche-EG*/;
                                          
                                          var n = 0;  // Intervallzähler
                                          
                                          var  PI = require('pi-controller');
                                          
                                          var pi = new PI(Xp, Tn); 
                                          pi.setOutputMax(pwm);   // default: OutputMax = 100
                                          
                                          // Abfrage für Sommer/Winter noch einfugen
                                          
                                          function control() {
                                            var x = getState(xid).val;    // Istwert in °C
                                            var w = getState(wid).val;    // Sollwert in °C
                                            var y = pi.Control(w - x);    // Stellsignal
                                            n++;
                                            if (n >= pwm) n = 0;
                                             if (n < 8 && y > 0)           // Mindesteinschaltdauer: 8 Intervalle
                                              {   setState(yid, 1);
                                          //        setState(pump, 1);
                                              }
                                            else if (n >= 8 && y <= n)    // Zwei Ventile werden geschalten
                                              {   setState(yid, 0);
                                          //        setState(pump, 0);
                                              }  
                                          }
                                          
                                          control();  // Script start
                                          
                                          setInterval(control, 30000 );  // Intervall: von 1 auf 0,5 Minuten geändert
                                          
                                          // Abschaltung
                                          on(idHeizen, function(dp) {
                                              heizen = dp.state.val;
                                              control();
                                          }); 
                                          
                                          

                                          nach dem Start des Scripts kommen zwei Warn Meldungen:

                                          (Ausdruck beim Start)

                                          08:03:46.803 [info] javascript.0 Stop script script.js.Heizung.Küche-EG.FBH-Küche-EG

                                          08:03:47.528 [info] javascript.0 Start javascript script.js.Heizung.Küche-EG.FBH-Küche-EG

                                          08:03:47.528 [warn] javascript.0 at control (script.js.Heizung.Küche-EG.FBH-Küche-EG:25:9)

                                          08:03:47.528 [warn] javascript.0 at script.js.Heizung.Küche-EG.FBH-Küche-EG:34:1

                                          08:03:47.528 [info] javascript.0 script.js.Heizung.Küche-EG.FBH-Küche-EG: registered 1 subscription and 0 schedules

                                          ist das so korrekt?

                                          Bei Script für die Regelung der Temperatur im OG genügt es ja wen die Abschaltung im
                                          > // 3-Punkt-Ansteuerung aus Stellsignal ist, oder?

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

                                            Die Warnung kommt, weil die Variable heizen nicht deklariert ist.

                                            var heizen = getState(idHeizen).val;
                                            

                                            Die Auswertung muss in der Funktion control() erfolgen, damit die Ventile zu bleiben.

                                               if (n < 8 && y > 0 && heizen)     // Mindesteinschaltdauer: 8 Intervalle
                                            
                                            

                                            Beim Übergang Winter zu Sommer ist es besser, die Ventile gleich zu schließen.

                                            // Abschaltung
                                            on(idHeizen, function(dp) {
                                                heizen = dp.state.val;
                                                if(!heizen) setState(yid, 0);
                                            });
                                            
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            750
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            47
                                            6240
                                            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