Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.

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

      Servus Apollon77,

      nachdem ich mein altes, auf der CCU laufendes Script, langsam austauschen möchte und auf meiner Suche nach Alternativen auf dein Script gestoßen bin, mal ein großes Danke für die Portierung des CCU-Scripts! :!:

      Beim Durchackern des Scripts glaube ich alles verstanden zu haben, aber eine Frage noch:

      Bei einem Solltemperatur Wechsel wird logischerweise erst "ab dem Wechsel" auf die neue Temperatur geregelt, also da gibt es keine "vorausschauende Funktion", oder?

      D.h. wenn ich Absenkungen drinnen hab, muss ich mir die zeitliche Änderung der Solltemperatur selber errechnen/bestimme/ausmessen und dementsprechend früher setzen?

      Wenn dem so ist, dann muss ich nur die Logik meines jetzigen Scripts in das Auslesen der Solltemperatur stecken - dieser Wert ist bei mir sowieso eine Variable und nicht im Wandthermostat gespeichert um niemanden dran rumdrehen zu sehen 😄

      Liebe Grüße

      tom

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

        Ich hatte unter viewtopic.php?f=21&t=10112 noch ein weiteres Skript mit AUfheizzeit-Messung und Vorasusteuerung gepostet -das erledigt das Thema wenn die Temperatur hoch soll.

        Da ich den Fall bei Absenkung nicht sehe (man will ja das es bis zum Ende warm bleibt) ist das Skript auf "erhöhung" ausgelegt.

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

          …spitze, danke dir!

          Liebe Grüße

          tom

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

            Servus Apollon77,

            ich hab dein Script nun im Einsatz und es scheint mal ganz gut zu klappen. Ich hab es noch dahingehend modifiziert (bzw. meinen Teil in einem eigenen Script zusammengefasst). dass ich die Heizung erst starte, wenn auch ein Ventil auf geht und wieder stoppe, wenn alle Ventile geschlossen sind. Unsere Heizung, bzw. die Pumpe schaltet sich leider nicht ab, wenn kein Ventil offen ist…so läuft die Pumpe immer gehen geschlossene Ventile.

            Das wirft jedoch das Problem auf, dass in der Übergangszeit die vom Script berechneten Heizzeiten natürlich zu gering sind und keine nennenswerten Auswirkungen auf die Temperatur haben, muss doch die Heizung erst "Fahrt aufnehmen".

            Nun möchte ich in diesem Fall (Heizung eigentlich aus) die Heizzeiten verlängern, finde jedoch die Stelle nicht wirklich im Script.

            Kannst du mir bitte sagen, wo in etwa die errechnete Heizzeit "fertig" ist und wo ich sie dann ggfls verlängern kann?

            Liebe Grüße

            Tom

            PS: das Programm mit seinen, ich sag mal "verschachtelten Variablen" ist für mich einfach zu hoch 😄

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

              Puuhhh .. da bin auch ich etwas überfragt. Ich habe ja das Skript auch "Nur" weitestgehend von einem Homematic-Skript (siehe Link) übernommen und in JavaScript umgewandelt.

              Von daher wäre @Twoxx wohl der bessere Ansprechpartner dazu. chreib Ihm doch mal hier e PN oder poste deine Frage in dem HM Thread.

              Alternativ ist die Frage ob das überhaupt nötig ist. Das Skript hier betrachtet die zurückliegende Temperaturentwicklung und projiziert die Zukunft. Von daher sollte es egal sein weil sich das ganze dann wieder relativiert über die Zeit bzw. alles eh davon abhängt wie gross dein Temperaturunterschied ist den Du ausgleichen musst.

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

                @apollon77:

                Puuhhh .. da bin auch ich etwas überfragt. Ich habe ja das Skript auch "Nur" weitestgehend von einem Homematic-Skript (siehe Link) übernommen und in JavaScript umgewandelt.

                Von daher wäre @Twoxx wohl der bessere Ansprechpartner dazu. chreib Ihm doch mal hier e PN oder poste deine Frage in dem HM Thread.

                Alternativ ist die Frage ob das überhaupt nötig ist. Das Skript hier betrachtet die zurückliegende Temperaturentwicklung und projiziert die Zukunft. Von daher sollte es egal sein weil sich das ganze dann wieder relativiert über die Zeit bzw. alles eh davon abhängt wie gross dein Temperaturunterschied ist den Du ausgleichen musst. `

                …OK, danke dir!

                Liebe Grüße

                Tom

                1 Reply Last reply Reply Quote 0
                • D
                  DenniskKo last edited by

                  Hallo,

                  kann mir mal bitte jemand erklären (bin leider Homematic unkundig :oops: )

                  um was für Werte es sich hier handelt?

                  	stateIdHeizungAktor: "hm-rpc.0.LEQ0282183.3.STATE",
                          stateIdHeizungAktorOnTime: "hm-rpc.0.LEQ0282183.3.ON_TIME",
                          stateIdSollTemperatur: "hm-rpc.0.NEQ0072178.2.SET_TEMPERATURE",
                          stateIdIstTemperatur: "hm-rpc.0.NEQ0072178.1.TEMPERATURE"
                  

                  stateIdHeizungAktor: -> Aktor = Stellmotor Heizung

                  stateIdHeizungAktorOnTime: -> ?

                  stateIdSollTemperatur: -> gewünschte Raumtemperatur

                  stateIdIstTemperatur: -> aktuelle (gemessene) Temperatur

                  Liege ich da richtig? Für einen kleinen Schubs in die richtige Richtung wäre ich dankbar.

                  Grüße, Dennis

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

                    Fast korrekt:
                    > stateIdHeizungAktorOnTime: -> ?

                    HM-Geräte haben einen "ON_TIME" Datenpunkt der angibt wie lange an bleiben soll. Dann macht der Akttor nach Ablauf der Zeit automatisch aus. Also quasi die "Zeitsteuerung für den Aktor". Das Skript schreibt da die Anzahl Sekunden rein nachdem aus gehen soll

                    1 Reply Last reply Reply Quote 0
                    • T
                      thobastian last edited by

                      Hallo !

                      Ich möchte dies Script verwenden und möchte nur sicherstellen, dass meine Hardware auch so angesteuert wird, wie gedacht.

                      Ich habe einen Stellantrieb, der mit HM-4er-Funkschlataktor gesteuert wird, also nur an oder aus.

                      Außerdem habe ich einen Thermostatregler und Fenstersensor von HM.

                      Jetzt ist der Fenstersensor direkt mit dem Thermostat von HM verknüpft. Der Thermostat gibt die Temperaturen in der Woche vor.

                      Wie werden die Temperaturen aus dem Thermostat verwendet um meinen Stellantrieb zu steuern ? Kann das Script hier helfen?

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

                        Das Skript hier arbeitet ausschliesslich auf den "Ist"-Werten und dem Soll-Wert und steuert in die Zukunft und versucht hierbei nicht zu "übersteuern".

                        Wie im ersten Post beschrieben die States entsprechend definieren und setzen und fertig. Diesem Skript sind Fenstersensoren erstmal egal, bzw eine Absenkung der gewünschten Soll-Temperatur wird im nächsten Laufzyklus dann berücksichtigt.

                        Versuchs aus dann siehst Du wie es tut.

                        Wegen dem Ansatz musst Du bei deiner Steuerung der "Wann soll es wie warm sein" aber die übliche Aufheizzeit berücksichtigen weil das Wochen/Tagesprogramm im Thermostat gespeichert ist und so für das Skript nicht verfügbar ist.

                        Für eine "Zukunftssteuerung" (also früh genug schonmal die Heizung einschalten) gibt es die Erweiterung aus dem ersten Post die aber darauf aufsetzt das die Steuerung nicht mit den Daten aus dem Thermostat läuft sondern über ein cooles Skript.

                        1 Reply Last reply Reply Quote 0
                        • E
                          e-i-k-e last edited by

                          Guten Abend,

                          habe das Skript wie folgt angepasst.

                          var rooms= {
                              'Fernsehzimmer': {
                                  stateIdHeizungAktor: "hm-rpc.0.PEQ0508369.1.STATE",
                                  stateIdHeizungAktorOnTime: "hm-rpc.0.PEQ0508369.1.ON_TIME",
                                  stateIdSollTemperatur: "hm-rpc.0.PEQ0508369.1.SOLLTEMP",
                                  stateIdIstTemperatur: "hm-rpc.0.LEQ0420645.4.ACTUAL_TEMPERATURE"
                              },
                              'Flur_unten': {
                                  stateIdHeizungAktor: "hm-rpc.0.PEQ0508369.5.STATE",
                                  stateIdHeizungAktorOnTime: "hm-hm-rpc.0.PEQ0508369.5.ON_TIME",
                                  stateIdSollTemperatur: "hm-rpc.0.PEQ0508369.5.SOLLTEMP",
                                  stateIdIstTemperatur: "mihome.0.devices.weather_v1_158d00023a7f01.temperature"
                              },
                              'Kueche': {
                                  stateIdHeizungAktor: "hm-rpc.0.PEQ0508369.6.STATE",
                                  stateIdHeizungAktorOnTime: "hm-rpc.0.PEQ0508369.6.ON_TIME",
                                  stateIdSollTemperatur: "hm-rpc.0.PEQ0508369.6.SOLLTEMP",
                                  stateIdIstTemperatur: "mihome.0.devices.weather_v1_158d0002478275.temperature"
                              },
                              'Wohnzimmer': {
                                  stateIdHeizungAktor: "hm-rpc.0.PEQ0508369.3.STATE", 
                                  stateIdHeizungAktorOnTime: "hm-rpc.0.PEQ0508369.3.ON_TIME",
                                  stateIdHeizungUnterstuetzungAktor: "hm-rpc.0.PEQ0508369.4.STATE",
                                  stateIdHeizungUnterstuetzungAktorOnTime: "hm-rpc.0.PEQ0508369.4.ON_TIME",
                                  stateIdSollTemperatur: "hm-rpc.0.PEQ0508369.3.SOLLTEMP",
                                  stateIdIstTemperatur: "mihome.0.devices.weather_v1_158d0002325c93.temperature"
                              }
                          
                          

                          Im Raum "Flur_unten" sind zwei und im Raum "Wohnzimmer" sind drei Heizkreise vorhanden.

                          Wie füge ich ich diese zu den Räumen hinzu?

                          Würde es wie folgt funktionieren?

                             'Wohnzimmer': {
                                  stateIdHeizungAktor: "1", 
                                  stateIdHeizungAktorOnTime: "1",
                                  stateIdHeizungAktor: "2", 
                                  stateIdHeizungAktorOnTime: "2",
                                  stateIdHeizungAktor: "3", 
                                  stateIdHeizungAktorOnTime: "3",
                                  stateIdSollTemperatur: "hm-rpc.0.PEQ0508369.3.SOLLTEMP",
                                  stateIdIstTemperatur: "mihome.0.devices.weather_v1_158d0002325c93.temperature"
                          
                          
                          1 Reply Last reply Reply Quote 0
                          • apollon77
                            apollon77 last edited by

                            ne ein Key kann nur einmal vorkommen. Mehrere Schaltaktoren dann solltest Du ein Javascript-State anlegen wo du das "wegkapselst" bzw über Scenen Adapter

                            1 Reply Last reply Reply Quote 0
                            • E
                              e-i-k-e last edited by

                              Danke für den Ansatz!

                              Ich werde es mal versuchen 🙂

                              1 Reply Last reply Reply Quote 0
                              • E
                                e-i-k-e last edited by

                                Guten Abend,

                                der weg über den Scenen Adapter hat funktioniert.

                                Das Skript lief bis gestern super.

                                Ich musste ein Neustart meiner CCU (Raspberry) durchführen und habe seit dem folgendes im ioBroker log.

                                8064_1.jpg
                                8064_2.jpg

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

                                  Restarte mal die hm-* Adapter

                                  1 Reply Last reply Reply Quote 0
                                  • E
                                    e-i-k-e last edited by

                                    Das war es schon! :lol:

                                    Danke!!

                                    Folgende Wahrung erscheint weiterhin.

                                    Was bedeutet diese?

                                    javascript.0 2018-11-11 23:12:12.271 warn at Object. <anonymous>(script.js.Fußbodenheizung:368:9)

                                    javascript.0 2018-11-11 23:12:12.270 warn at ventilLogik (script.js.Fußbodenheizung:248:25)

                                    javascript.0 2018-11-11 23:12:12.270 warn at controlFBHAktor (script.js.Fußbodenheizung:387:9)

                                    javascript.0 2018-11-11 23:12:12.270 warn Wrong type of scene.Fußboden_Flur_OnTime: "number". Please fix, while deprecated and will not work in next versions.</anonymous>

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

                                      Was hat der Scene Datenpunkt denn für einen Datentyp? Das Skript schreibt eine zahl rein. Das heisst der sollte "number" oder "Mixed" haben, sonst kommt diese Meldung

                                      1 Reply Last reply Reply Quote 0
                                      • E
                                        e-i-k-e last edited by

                                        Kurze Rückmeldung, funktioniert nun alles wie gewollt.

                                        Vielen Dank für deine super arbeit und den guten Support :!:

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

                                          Hallo in die Runde,

                                          da wir hier nur Wand- und Fussbodenheizung mit allen bekannten Vor- und Nachteilen haben,

                                          gefällt mir das Script eigentlich ganz gut. 🙂

                                          Der einzige Haken für mich ist ich möchte das gern mit "Non" HM-Hardware verwenden da ich nun mal keine HM-Hardware habe. 😉

                                          Abhilfe soll folgendes Konstrukt in der Funktion "controlFBHAktor" bringen.

                                          function controlFBHAktor(roomName, enabled, time) {
                                              var useSupport = false;
                                              if (rooms[roomName].stateIdHeizungUnterstuetzungAktor) {
                                                  var isttemperatur = getState(rooms[roomName].stateIdIstTemperatur).val;
                                                  var solltemperatur = getState(rooms[roomName].stateIdSollTemperatur).val;
                                                  if (enabled && solltemperatur - isttemperatur > rooms[roomName].heizunterstuetzungKelvin) {
                                                      if (debug) {console.log('    Steuern UnterstützungsAktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ')');}
                                                      useSupport = true;
                                                  }
                                                  else if (!enabled || getState(rooms[roomName].stateIdHeizungUnterstuetzungAktor).val) useSupport = true;
                                              }
                                          
                                              if (enabled && time) {
                                                  time = Math.round(time);
                                                  setState(rooms[roomName].stateIdHeizungAktorOnTime, time, false, function() {
                                                      if (debug) {console.log('  *  Steuern Aktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ')');}
                                                      setState(rooms[roomName].stateIdHeizungAktor, true, false);
                                          
                                          // ************************************************************************
                                          // **************************  AB HIER ! ********************************
                                          
                                                      let startTime = new Date(Date.now() + time * 1000);
                                                      console.log(roomName + '.Aktor aus um: ' + startTime);
                                                      let endTime = new Date(startTime.getTime() + 1000);
                                                      //console.log(endTime);
                                                      clearSchedule(rooms[roomName].sch);
                                                       rooms[roomName].sch = schedule({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function () {
                                                          setState(rooms[roomName].stateIdHeizungAktor, false );
                                                          setState(rooms[roomName].stateIdHeizungAktorOnTime,0 );
                                                      clearSchedule(rooms[roomName].sch);
                                                      });
                                          
                                           // **************************  BIS HIER ! ********************************
                                           // ************************************************************************      
                                          
                                                      if (useSupport) {
                                                          setState(rooms[roomName].stateIdHeizungUnterstuetzungAktorOnTime, time, false, function() {
                                                              if (debug) {console.log('    Steuern UnterstützungsAktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ', tempDiff=' + (solltemperatur - isttemperatur) + ')');}
                                                              setState(rooms[roomName].stateIdHeizungUnterstuetzungAktor, true, false);
                                                          });
                                                      }
                                                  });
                                              }
                                              else {
                                                  if (debug) {console.log('    Steuern Aktor FBH ' + roomName + '--> ' + enabled);}
                                                  setState(rooms[roomName].stateIdHeizungAktor, enabled, false);
                                                  if (useSupport) {
                                                      if (debug) {console.log('    Steuern UnterstützungsAktor FBH ' + roomName + '--> ' + enabled);}
                                                      setState(rooms[roomName].stateIdHeizungUnterstuetzungAktor, enabled, false);
                                                  }
                                              }
                                          

                                          Ich lass da einfach für jeden Schaltvorgang ein "Schedulereintrag" erstellen welcher nach der errechneten Zeit den "Aktor" auf "false" und die "Zeit" auf "0" setzt und sich danach selbst löscht.

                                          Im "Trockentest" mit 4 Räumen klappt das schon mal wie gewünscht.

                                          Bevor ich das aber in die Praxis umsetze,

                                          was sagt ihr dazu?

                                          Kann man das so machen oder gibt es eine bessere (elegantere) Lösung?

                                          1 Reply Last reply Reply Quote 0
                                          • D
                                            DavidFD last edited by

                                            Hab mir das vorhin aucb für sonoff 4ch umgeschrieben.

                                            Ich nehme einfach ein settimeout von JS.

                                            Im Livetest hatte ich vorhin die schönste Kurve bisher. Besser als meine PI - Regler Versuche

                                            so siehts grad aus: Hab etwas abgespeckt mit den Supportaktoren.

                                            function controlFBHAktor(roomName, enabled, time) {
                                                var useSupport = false;
                                            
                                                if (enabled && time) {
                                                    time = Math.round(time);
                                                    if(debug) { console.log("switchoff timer: "+ time+""); }
                                                    clearTimeout(rooms[roomName].timeout)
                                                    setState(rooms[roomName].stateIdHeizungAktor, enabled, false);
                                                    rooms[roomName].timeout =  setTimeout(function() {switchOff(rooms[roomName].stateIdHeizungAktor); }, time * 1000);
                                                } else {
                                                    console.log("enabled = "+enabled);
                                                    if (debug) {console.log('    Steuern Aktor FBH ' + roomName + '--> ' + enabled);}
                                                    setState(rooms[roomName].stateIdHeizungAktor, enabled, false);
                                                }
                                            }
                                            
                                            function switchOff(id) {
                                               console.log("Ausschalten");
                                               setState(id, false);
                                            }
                                            
                                            
                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            528
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            22
                                            83
                                            13302
                                            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