Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Frage] Fußbodenheizung steuern mit ioBroker

    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

    [Frage] Fußbodenheizung steuern mit ioBroker

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

      Oh, unverhohlene Werbung, wie erfrischend.

      Spam Bots sind was feines :lol:

      Entsprechenden werbepost gelöscht, Homoran (Mod)

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

        @paul53: kannst du die Parameter die ne das Skript etwas erklären ?! Was stellt der alles sicher?

        Stellt der sicher das rechtzeitig ausgeschaltet wird damit es nicht übersteuert? Schaltet es frühzeitig an damit es nicht auskühlt wenn die Temperatur absinkt?

        Will das auch gerade umsetzen …

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

          @apollon77:

          Stellt der sicher das rechtzeitig ausgeschaltet wird damit es nicht übersteuert? Schaltet es frühzeitig an damit es nicht auskühlt wenn die Temperatur absinkt? `
          Das ist kein 2-Punkt-Regler, sondern ein PI-Regler. Wenn die Regelabweichung gering wird, ändert sich das Tastverhältnis (Einschalt- zu Ausschaltdauer), wobei die Periodendauer eine Stunde beträgt. Ist Istwert = Sollwert bleibt das Tastverhältnis konstant.

          Die hohe Trägheit der FBH macht eine Periodendauer der PWM von einer Stunde möglich. Eine kürzere Periodendauer verringert die Lebensdauer der Relais, da diese nur eine begrenzte Anzahl von Schaltspielen vertragen (gilt nicht für Solid state relais).

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

            Ok, verstehe nur Bahnhof. Muss mich also erstmal einlesen was genau ein pi Regler ist und wie der funktioniert …

            1 Reply Last reply Reply Quote 0
            • Q
              quorle last edited by

              Muss mich hier auch einmal einklinken.

              Könnte man das Script so umschreiben, damit man HM-CC-RT-DN (Heizkörperthermostate) damit steuern könnte?

              Ich regle momentan meine Räume mittels Heizplan. Jetzt würde ich aber zusätzlich noch eine eigene Regelung mit einbinden.

              Funktionsweise:

              • Dein Script holt sich die aktuelle Solltemperatur vom Heizplanscript

              • Dein Script holt sich die IST-Temp vom externen Sensor

              • Dein Script errechnet die einzustellende Temperatur ( damit der Heizthermostat intern das Ventil öffnen und schließen kann ) und sendet diese an den Thermostat

              • Die Logik vom Heizplanscript soll nicht berührt werden

              Da ich keine Wandthermostate benutze ( die ja diese Regellogik integriert haben ) könnte es doch auch eine PI-Regelung, jedoch müsste diese einzustellende Temperatur ausgeben und keine einzustellende Ventilöffnung

              Wäre dies denn möglich?

              So sieht dein Script aktuell bei mir aus und ist auf einen State zur Ausgabe gelegt:

              ! ````
              // PI-Regler Raumheizung
              ! // Raumkurzname am Anfang des Datenpunktnamen und als JS-Gruppenname
              //var raum = name.split(".")[2];
              ! // P-Band in K, Nachstellzeit in s
              var Xp = 4;
              var Tn = 600;
              ! var xid = 'hm-rpc.3.CUX1200003.1.TEMPERATURE';
              var wid = 'hm-rpc.1.OEQ1712335.4.SET_TEMPERATURE';
              var yid = 'javascript.0.PI-Regler-Schlafzimmer';
              ! var  PI = require('pi-controller');
              ! var pi = new PI(Xp, Tn);
              pi.setOutputMax(1.0);   // default: OutputMax = 100
              ! 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
                setState(yid, y);
              }
              ! control();  // Script start
              on(xid, control);
              on(wid, control);
              ! var timer = null;
              if (Tn) {
                 timer = setInterval(control, 250 * Tn );
              }
              else {
                 if (timer) {
                    clearInterval(timer);
                    timer = null;
                 }

              
              ****Die Ausgabe auf den State (PI-Regler-Schlafzimmer):****
              
              0.9246725000000009 %
              1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

                @quorle:

                Könnte man das Script so umschreiben, damit man HM-CC-RT-DN (Heizkörperthermostate) damit steuern könnte? `
                Nein, die Ventilstellung kann man nicht beeinflussen, sondern nur anzeigen. Der HKT regelt mit einem internen PI-Regler.

                1 Reply Last reply Reply Quote 0
                • Q
                  quorle last edited by

                  Ok, das man die Ventilstellung des Thermostates nicht beeinflussen kann wusste ich, darum wollte ich ja dem Thermostat immer die errechnete Temperatur senden.

                  Man muss den dem PI-Regler so umschreiben können, dass er in Temperaturschritten regelt und ermittelt?

                  Oder gibt es etwas anderes, dass meine Bedürfnisse vielleicht erledigen könnte?

                  Nachtrag:

                  Verbessert mich, wenn ich unrecht habe.

                  bei einer Solltemp vom: 21°C

                  und

                  einer IST-Temp von: 20,4

                  zeigt das Script in der State momentan (aufgerundet): 0,6

                  Die Ausgabe des Scriptes ist ja 0-100% ?

                  Sprich, wenn eine 1 ansteht, sollte dass Ventil 100% offen sein?

                  Oder liege ich hier falsch?

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

                    @quorle:

                    Man muss den dem PI-Regler so umschreiben können, dass er in Temperaturschritten regelt und ermittelt? `
                    Den Istwert kann man nicht beeinflussen, sondern nur den Sollwert. Aber der wird ja durch den Thermostaten vorgegeben.
                    @quorle:

                    Die Ausgabe auf den State (PI-Regler-Schlafzimmer):

                    0.9246725000000009 % `
                    Das sind keine Prozent, da
                    @quorle:

                    pi.setOutputMax(1.0);   // default: OutputMax = 100
                    ```` `  
                    

                    Für Prozentausgabe muss der Befehl auskommentiert oder gelöscht werden.

                    1 Reply Last reply Reply Quote 0
                    • Q
                      quorle last edited by

                      erst einmal vielen Dank für die Hilfe, die man braucht wenn man nicht programmieren kann :lol:

                      Die Prozentausgabe klappt schon einmal ganz gut.

                      Jetzt würde ich noch einen anderen Ansatz mit in mein persönliches Script packen wollen.

                      1.

                      • Die Prozentausgabe auf 2 Nachkommastellen reduzieren

                      2.

                      • Einen Dreisatz einbinden und auf eine State schreiben lassen. Ich habe schon einiges versucht und auch im Internet gesucht, jedoch möchte es einfach nicht klappen.

                      • Der Dreisatz sollte so aussehen: 5/100*die prozentausgabe in Prozent

                      • und das Ergebnis dann auf einen State legen

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

                        Zu 1.

                        setState(yid, Math.round(100 * y) / 100;
                        
                        

                        Zu 2.

                        var sw_korrektur = 5 * (y - 50) / 100;  // +/- 2,5 Grad
                        
                        1 Reply Last reply Reply Quote 0
                        • Q
                          quorle last edited by

                          Ich bin wirklich zu doof für JavaScript.

                          Egal an welche Stelle ich die scriptzeilen einfüge, kommt am state nichts an. In der log steht so auch nichts.

                          „Zu doof für JavaScript“ 😢

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

                            Auf welchem Datenpunkt erwartest Du die Ausgabe ? Du musst erst einen Datenpunkt für den korrigierten Sollwert erzeugen (z.B. im Reiter "Objekte" unter javascript.0). Dann mit setState am Ende der Funktion den Wert setzen:

                            var sw_korrektur = 5 * (y - 50) / 100;  // +/- 2,5 Grad
                            setState('javascript.0.Sollwert_korrigiert', w + sw_korrektur);
                            
                            1 Reply Last reply Reply Quote 0
                            • Q
                              quorle last edited by

                              Also den State hab ich schon länger erstellt.

                              In den Objekten sieht es bei mir dann so aus:

                              5278_objekte.png

                              Nun wird der Ausgang vom PI-Regler in Prozent und mit 2 Nachkommastellen angezeigt –> schon einmal sehr gut.

                              Aber die Ausgabe der korregierten Sollwerttemperatur ist nicht mir 2 Nachkommastellen.

                              Mein Script sieht jetzt so aus:

                              // PI-Regler Raumheizung
                              
                              // Raumkurzname am Anfang des Datenpunktnamen und als JS-Gruppenname
                              //var raum = name.split(".")[2];
                              
                              // P-Band in K, Nachstellzeit in s
                              var Xp = 4;
                              var Tn = 600;
                              
                              var xid = 'hm-rpc.3.CUX1200003.1.TEMPERATURE';
                              var wid = 'hm-rpc.1.OEQ1712335.4.SET_TEMPERATURE';
                              var yid = 'javascript.0.PI-Regler-Schlafzimmer';
                              
                              var  PI = require('pi-controller');
                              
                              var pi = new PI(Xp, Tn); 
                              //pi.setOutputMax(1.0);   // default: OutputMax = 100
                              
                              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
                                var sw_korrektur = 6 * (y - 50) / 100;  // +/- 2,5 Grad
                                setState(yid, y);
                                setState(yid, Math.round(100 * y) / 100); // Ergebnis vom PI-Regler auf 2 Nachkommastellen
                                setState('javascript.0.Ausgabe_Temp_von_PI-Regler', w + sw_korrektur); // Ausgabe korregierte Sollwerttemp für Regler
                              
                              }
                              
                              control();  // Script start
                              on(xid, control);
                              on(wid, control);
                              
                              var timer = null;
                              if (Tn) {
                                 timer = setInterval(control, 250 * Tn );
                              }
                              else {
                                 if (timer) {
                                    clearInterval(timer);
                                    timer = null;
                                 }
                              }
                              
                              
                              1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 last edited by

                                @quorle:

                                Aber die Ausgabe der korregierten Sollwerttemperatur ist nicht mir 2 Nachkommastellen. `
                                Lösche bitte den Befehl

                                  setState(yid, y);
                                

                                Eine Nachkommastelle genügt auch:

                                  setState('javascript.0.Ausgabe_Temp_von_PI-Regler', Math.round(10 * (w + sw_korrektur)) / 10); // Ausgabe korrigierte Sollwerttemp für Regler
                                
                                
                                1 Reply Last reply Reply Quote 0
                                • Q
                                  quorle last edited by

                                  @paul53:

                                  @quorle:

                                  Aber die Ausgabe der korregierten Sollwerttemperatur ist nicht mir 2 Nachkommastellen. `
                                  Lösche bitte den Befehl

                                    setState(yid, y);
                                  

                                  Eine Nachkommastelle genügt auch:

                                    setState('javascript.0.Ausgabe_Temp_von_PI-Regler', Math.round(10 * (w + sw_korrektur)) / 10); // Ausgabe korrigierte Sollwerttemp für Regler
                                  
                                  ```` `  
                                  

                                  Woooow 😮 Super, danke 😉 jetzt läuft es. Da sieht man einmal, dass ich mich in die Welt des Javascript noch sehr viel einlesen muss. Ich kann nur Danke sagen.

                                  Aber jetzt noch eine Frage, kann ich die States unter "Objekte" auch in verschieden Ordner packe?

                                  Sprich:

                                  Javascript.0 –> Heizung --> und dann einzelne Ordner für Raumnamen erzeugen?

                                  Sollte doch auch gehen?

                                  Und das Script muss unter Common laufen?

                                  Und kann man vielleicht noch den korregierten Sollwert nur alle 5 Minuten auf einen weiteren State setzen lassen, so dass dieser dann an den Regler gesendet wird?

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

                                    @quorle:

                                    kann ich die States unter "Objekte" auch in verschieden Ordner packe?

                                    Javascript.0 –> Heizung --> und dann einzelne Ordner für Raumnamen erzeugen? `
                                    Ja. Wenn Du die Datenpunkte im Reiter "Objekte" anlegst, dann javascript.0 selektieren und den Namen entsprechend vergeben, wobei Punkte im Namen (in der ID) die Ordnerstruktur erzeugen. Beispiel:

                                    Der Name Heizung.Kueche.Ausgabe_Temp_von_PI-Regler erzeugt die ID javascript.0.Heizung.Kueche.Ausgabe_Temp_von_PI-Regler mit dem Ordner Heizung und dem Unterordner Kueche.
                                    @quorle:

                                    Und das Script muss unter Common laufen? `
                                    Nein, Du kannst z.B. eine Gruppe Heizung anlegen und darunter eine Untergruppe mit dem Raumnamen. In dieser Untergruppe erstellst Du dann die raumbezogenen Skripte. Nur unter der Gruppe global kann man keine normalen Skripte erstellen. global ist für häufig verwendete eigene Funktionen vorgesehen.

                                    1 Reply Last reply Reply Quote 0
                                    • Q
                                      quorle last edited by

                                      Langsam verstehe ich das ganze schon besser, also das mit den Strukturen.

                                      Und kann man vielleicht noch den korregierten Sollwert nur alle 5 Minuten auf einen weiteren State setzen lassen, so dass dieser dann an den Regler gesendet wird? Das man eine "variable" Zeit vorgeben kann?

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

                                        @quorle:

                                        den korregierten Sollwert nur alle 5 Minuten auf einen weiteren State setzen lassen, so dass dieser dann an den Regler gesendet wird? `
                                        An welchen Regler soll er gesendet werden ?

                                        1 Reply Last reply Reply Quote 0
                                        • Q
                                          quorle last edited by

                                          Guten Morgen.

                                          Also ich nutze auch noch das Script " http://forum.iobroker.net/viewtopic.php?f=21&t=10096 " von dem aus meine ganzen Temperatur Sollwerte kommen.

                                          Nun müsste ich das Script " Integrierte Heizungsthermostatsteuerung " anpassen, dass es die Vorgabe für den Temp Sollwert auf eine State schickt und mit dem Script " Fußbodenheizung steuern mit ioBroker " würde ich den neuen Temp Sollwert auf den Regler senden. Sagen wir einmal alle 5-10 Minuten ( vielleicht könnte man das variabel gestalten ).

                                          Der Reglereingang heißt: hm-rpc.1.OEQ1712335.4.SET_TEMPERATURE

                                          Aber ich glaube, dass es jetzt etwas zu kompliziert wird. Bin mir jetzt auch nicht sicher, ob ich das ganze bis ins letzte Detail jetzt zu Ende gedacht habe. Oder ob mir nicht wieder irgendwas neues einfällt :shock:

                                          Wobei das ganze noch nicht so funktioniert, denn heute früh errechnete er eine " korrigierte " Sollwertvorgabe von 12 °C , wenn diese Temp ja auf den Heizregler geschrieben werden würde, dann würde dieser ja das Ventil öffnen, obwohl die Vorgabe ( 14,5 °C ) erreicht war.

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

                                            @quorle:

                                            In den Objekten sieht es bei mir dann so aus:

                                            Keine Datenpunkte unter javascript.0.scriptEnabled erstellen !

                                            @quorle:

                                            Also ich nutze auch noch das Script " http://forum.iobroker.net/viewtopic.php?f=21&t=10096 " von dem aus meine ganzen Temperatur Sollwerte kommen.

                                            Das Skript musst Du so anpassen, dass es den Sollwert nicht an den Thermostaten sendet, sondern in einen virtuellen Datenpunkt schreibt (z.B. "javascript.0.Heizung.Schlafzimmer.Solltemperatur"). Außerdem muss die Nachstellzeit des PI-Reglers (Script) erhöht werden.

                                            // PI-Regler Raumheizung für Kaskade Raumsensor - HKT-Temperatur
                                            
                                            // P-Band in K, Nachstellzeit in s
                                            const Xp = 4;
                                            const Tn = 2400; // 40 Minuten
                                            
                                            const xid = 'hm-rpc.3.CUX1200003.1.TEMPERATURE';
                                            const wid = 'javascript.0.Heizung.Schlafzimmer.Solltemperatur';
                                            const yid = 'hm-rpc.1.OEQ1712335.4.MANU_MODE';
                                            
                                            const  PI = require('pi-controller');
                                            
                                            var pi = new PI(Xp, Tn);
                                            pi.setOutputMax(5.0);   // default: OutputMax = 100
                                            
                                            function control() {
                                              var x = getState(xid).val;  // Istwert in °C
                                              var w = getState(wid).val;  // Sollwert in °C
                                              var y = pi.Control(w - x) - 2;  // +3 / -2 Grad
                                              y = Math.round(2 * (w + y)) / 2;  // Auflösung 0,5 Grad (Thermostat)
                                              setState(yid, y);
                                            }
                                            
                                            control();  // Script start
                                            // on() auskommentiert, denn es soll nur alle 10 Minuten an Thermostat gesendet werden
                                            // on(xid, control);
                                            // on(wid, control);
                                            
                                            var timer = null;
                                            if (Tn) {
                                               timer = setInterval(control, 250 * Tn );
                                            }
                                            else {
                                               if (timer) {
                                                  clearInterval(timer);
                                                  timer = null;
                                               }
                                            }
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            716
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            30
                                            7558
                                            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