Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Vorlage] Heizungsthermostatsteuerung 2.1 - Script

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    [Vorlage] Heizungsthermostatsteuerung 2.1 - Script

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

      @quorle:

      hab ich es richtig verstanden, dass die Solltemperatur die zum Regler gesendet wird nur im VIS einzustellen ist? Und diese nicht im Programm an den Regler gesendet wird? `
      Nein, da Du eine Reglerkaskade möchtest, wird die Solltemperatur, die zum Regler gesendet wird, im Skript gesendet. Der Vorgabesollwert für den Hilfsregler (Skript) ist ein virtueller Datenpunkt ("javascript.0…"), dessen Wert im VIS einzustellen ist.

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

        Hallo Zusammen,

        kurze Zwischenfrage 🙂

        Gibt es bei den "Zeit-Widgets" eine Möglichkeit die Sekunden nicht mit anzuzeigen?
        1853_unbenannt.png
        Diese Option verhindert ja nur dass die Sekunden im Popup nicht angezeigt werden.

        Würde das nicht Sinn machen die dann auch komplett auszublenden?

        Oder geht das irgendwo anders?

        Gruß

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

          Hi

          hier noch mehr gefilterte Logs, überschreiten ungepackt leider die 2mb grenze daher als archiv; vielleicht hilfts…
          4760_log25.02.rar

          1 Reply Last reply Reply Quote 0
          • U
            UweS last edited by

            Hallo

            Jetzt konnte ich ein schon gelöstes Problem wieder erkennen.

            Die Abwesenheitserkennung ist aktiviert und funktioniert. D.h. wenn alle G tags außer Haus sind geht der Status Jemand Da auf false.

            Ich bin heute um 14:46 nach Hause gekommen und der Status hat sich auf true gesetzt, allerdings im Heizplan ist zwar das Häckchen auf anwesend aber die Temp passt sich nicht an.

            4787_screenshoot_heizung.png
            4787_screenshoot_heizplan.png

            Logs kann ich nachliefern.

            Was mir jetzt noch aufgefallen ist.

            Wenn ich im VIS z.B. Partymodus anwähle dann ändert sich die Temp und wenn ich diesen abwähle passt die eingestellte Temp wieder.

            Vielleicht hilft das ja für die Fehlersuche.

            Vielen Dank für die Hilfe

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

              Hi Looxer,

              @looxer01:

              @eric2905:

              Später werde ich den Raum mal um 5 Minuten verschieben. Mal sehen, ob das was bringt. `
              Das könnte sogar helfen. Ich hatte mal darüber nachgedacht den Schedule immer ein paar Sekunden zu verschieben damit es keine Konflikte gibt.

              Wenn du das erfolgreich testest, dann weiss ich was zu tun ist. `
              ich habe jetzt (nach Test mit einem Raum) alle Räume mit jeweils 1 Minute Verschiebung laufen. Der Test mit allen 9 Räumen läuft nun seit fast 2 Wochen und seitdem habe ich keine "Fehl-Einstellungen" mehr festgestellt. Alle Räume schalten zu den definierten Zeiten (lasse mich derzeit jeweils per Pushover informieren).

              Gruß,

              Eric

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

                Hallo zusammen!

                Von mir auch mal ein grosses Lob! Hab das Script und visu jetzt seit drei, vier Wochen in Betrieb und es funktioniert soweit gut. Auch Dank der Tipps, die es hier immer wieder gibt.

                Hut ab und Daumen hoch!

                Viele Grüsse - Stefan

                1 Reply Last reply Reply Quote 0
                • L
                  looxer01 last edited by

                  Hi,

                  leider bin ich zur Zeit beruflich ziemlich landunter. Habt ihr sicher an meinen fehlenden Antworten gemerkt.

                  Liegt eben daran, dass auch die Wochenenden mit Arbeitszeiten versehen sind. Ich hoffe, dass sich das bald wieder aendert.

                  Das Thema der nicht ausgefuehrten Schaltungen zu den geplanten Zeiten hat sich ja geklärt. Gleiche Uhrzeiten des schedules können zu Problemen führen.

                  Zwei zusätzliche Zeilen sollten hier Abhilfe veschaffen. Ich waere dankbar, wenn das jemand testen könnte.

                  (Es wird eine zufällige Zeitverschiebung zwischen 1 und 30 Sekunden eingeplant.)

                  Hierzu einfach die Funktion austauschen.

                  vG Looxer

                  ! ! //----------------------------------------------------------------------------------------------------- // Funktion ExecuteTempDetermination checkt ob eineThermostat/Raum Temperatur manuell angpasst wurde //----------------------------------------------------------------------------------------------------- function ExecuteTempDetermination(roomName, id) { var ActiveRoomProfile; var ScheduledSollTemp; ! // Findung des aktuellen RaumProfiles ActiveRoomProfile = ActiveProfile(roomName); // Ermittlung des aktiven Raumprofils //die geplante Soll Temperatur aus dem Raumschedule aus dem aktuellen Profil ermitteln ScheduledSollTemp = SelectSwitchTime(roomName, ActiveRoomProfile, "CurrSollTemp",id); // Ermittlung der geplanten Solltemperatur if (debug) { log("Routine ExecuteTempDetermination: raum " + roomName + "Solltemp nach Switchtime: " + ScheduledSollTemp + " Findung " + Source_SchedulePoint, "info"); } // Schauen ob die ermittelte Temperatur angepasst werden muss z.B. party Gaeste etc ScheduledSollTemp = OverruleSollTemp(roomName, ActiveRoomProfile, ScheduledSollTemp, id); //Global und Profilparameter koennen den schedule uebersteuern if (debug) { log("Routine ExecuteTempDetermination: raum " + roomName + "Solltemp nach overrule: " + ScheduledSollTemp+ " Findung " + Source_GlobalParameter, "info"); } ! // jetzt die Temperatur dem Thermostat uebermitteln SetTemp(roomName, ScheduledSollTemp, id, true); // jetzt die Temperatur schalten ! if (NextSchedules[roomName]) { if (debug) { log("Schedule gelöscht für " + roomName, "info"); } clearSchedule(NextSchedules[roomName]); NextSchedules[roomName] = null; } // Mo_00:00:00 var schedArr = Source_SchedulePoint.split("_"); // [0]=Mo, [1]=00:00:00 var ZufallSek = Math.floor(Math.random() * (30 - 1 + 1)) + 1; schedArr[1] = schedArr[1].substr(0,6) + ZufallSek; var nextSchedule = parseInt(schedArr[1].substr(6, 2), 10) + " " + parseInt(schedArr[1].substr(3, 2), 10) + " " + parseInt(schedArr[1].substr(0, 2), 10) + " * * *"; if (debug) { log("Setze Schedule für nächste Planzeit " + nextSchedule + " für Raum " + roomName, "info"); } NextSchedules[roomName] = schedule(nextSchedule, function() { if (debug) { log("Schedule Triggered für nächste Planzeit für Raum " + roomName, "info"); } TriggerUpdate(roomName); }); } // ende Funktion !

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

                    Schaue ich mir mal an.

                    Snapshot, basteln, fertig.

                    Melde mich.

                    Gruß,

                    Eric

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

                      Juhu Danke Looxer mit dem neuen Code-schnipsel läuft es jetzt auch bei mir Gut!

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

                        @eric2905:

                        Schaue ich mir mal an.

                        Snapshot, basteln, fertig.

                        Melde mich. `
                        bin jetzt das gekommen, das einzubauen.

                        Läuft jetzt ohne manuelle Verschiebung.

                        Gruß,

                        Eric

                        1 Reply Last reply Reply Quote 0
                        • L
                          looxer01 last edited by

                          @eric2905:

                          Läuft jetzt ohne manuelle Verschiebung. `
                          super danke euch fürs update.

                          Ich denke, dass ich es am Ende nochmal anders einbauen werde. (ohne Zufallszahlen)

                          Damit dürften auch keine zufälligen Überschneidungen auftreten.

                          vG Looxer

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

                            Gib mir ein paar Tage zum Testen - habe es erst heute eingebaut.

                            Gruß,

                            Eric

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

                              @looxer01:

                              Zwei zusätzliche Zeilen sollten hier Abhilfe veschaffen. Ich waere dankbar, wenn das jemand testen könnte.

                              (Es wird eine zufällige Zeitverschiebung zwischen 1 und 30 Sekunden eingeplant.) `

                              Hi Looxer,

                              Ich habe die Änderung am vergangenen Wochenende eingespielt, nachdem ich wegen häufig auftretender Fehlern beim Schedulewechsel wieder auf die alte Version zurückgegangen war. Seitdem läuft die V2 absolut stabil. Vielen Dank!

                              1 Reply Last reply Reply Quote 0
                              • L
                                looxer01 last edited by

                                @looxer01:

                                Ich denke, dass ich es am Ende nochmal anders einbauen werde. (ohne Zufallszahlen) `

                                Hi,

                                ich habe mich des Themas nochmal angenommen da ich die Befürchtung habe, dass durch die Zufallszahlen auch Überschneidungen des Schedules vorkommen können. Die Wahrscheinlichkeit erhöht sich mit der Anzahl der zu planenden Räume.

                                Daher habe ich jetzt folgendes implementiert:

                                1. Die schedules werden mit einem Abstand von 2 Sekunden eingeplant

                                2. Wenn es mehr als 28 zu heizende Räume gibt (wohl unwahrscheinlich, dann wird angefangen jede Sekunde zu planen

                                3. erst ab 59 zu heizenden Räume gibt es Überschneidungen.

                                Die Fälle 2 und 3 dürften wohl eher theoretisch sein.

                                Wäre schön, wenn jemand testen könnte, ob die 2 Sekunden Abstand reichen. Ich habe bei mir damit kein Problem, hatte ich vorher aber auch nicht.

                                Zum Testen einfach wieder die Funktion austauschen:

                                ! ````
                                //-----------------------------------------------------------------------------------------------------
                                // Funktion ExecuteTempDetermination checkt ob eineThermostat/Raum Temperatur manuell angpasst wurde
                                //-----------------------------------------------------------------------------------------------------
                                function ExecuteTempDetermination(roomName, id) {
                                var ActiveRoomProfile;
                                var ScheduledSollTemp;
                                ! // Findung des aktuellen RaumProfiles
                                ActiveRoomProfile = ActiveProfile(roomName); // Ermittlung des aktiven Raumprofils
                                //die geplante Soll Temperatur aus dem Raumschedule aus dem aktuellen Profil ermitteln
                                ScheduledSollTemp = SelectSwitchTime(roomName, ActiveRoomProfile, "CurrSollTemp",id); // Ermittlung der geplanten Solltemperatur
                                if (debug) {
                                log("Routine ExecuteTempDetermination: raum " + roomName + "Solltemp nach Switchtime: " + ScheduledSollTemp + " Findung " + Source_SchedulePoint, "info");
                                }
                                // Schauen ob die ermittelte Temperatur angepasst werden muss z.B. party Gaeste etc
                                ScheduledSollTemp = OverruleSollTemp(roomName, ActiveRoomProfile, ScheduledSollTemp, id); //Global und Profilparameter koennen den schedule uebersteuern
                                if (debug) {
                                log("Routine ExecuteTempDetermination: raum " + roomName + "Solltemp nach overrule: " + ScheduledSollTemp+ " Findung " + Source_GlobalParameter, "info");
                                }
                                ! // jetzt die Temperatur dem Thermostat uebermitteln
                                SetTemp(roomName, ScheduledSollTemp, id, true); // jetzt die Temperatur schalten
                                ! if (NextSchedules[roomName]) {
                                if (debug) { log("Schedule gelöscht für " + roomName, "info"); }
                                clearSchedule(NextSchedules[roomName]);
                                NextSchedules[roomName] = null;
                                }
                                // jetzt Delay-Sekunden ermitteln, um die Schedules nicht gleichzeitig auszuführen
                                var delaysek=0;
                                var z = 1;
                                for (var roomCheck in rooms) { // loop ueber all Raeume
                                roomCheck = roomCheck.replace(/\s/g, "_"); // Blanks durch unterstrich ersetzen
                                if ( roomCheck === roomName) {
                                delaysek = z * 2; // es werden alle 2 Sekunden ein schedule geplant also 2,4,6....
                                if (delaysek > 58) { // jetzt sind 58 Sekunden erreicht
                                delaysek = (delaysek - 59) * 2 - 1 ; // also mit 1,3,5... Sekunden weiter planen
                                }
                                if ( z > 59) { // mehr als 59 Räume mit Thermostaten? wohl kaum
                                delaysek = 0;
                                }
                                break;
                                }
                                z = z + 1
                                }//endfor roomcheck

                                // jetzt die Cron Pattern bestimmen und einplanen
                                var schedArr = Source_SchedulePoint.split("_"); // [0]=Mo, [1]=00:00:00
                                schedArr[1] = schedArr[1].substr(0,6) + delaysek;
                                var nextSchedule = parseInt(schedArr[1].substr(6, 2), 10) + " " + parseInt(schedArr[1].substr(3, 2), 10) + " " + parseInt(schedArr[1].substr(0, 2), 10) + " * * *";
                                if (debug) { log("Setze Schedule für nächste Planzeit " + nextSchedule + " für Raum " + roomName, "info"); }
                                NextSchedules[roomName] = schedule(nextSchedule, function() {
                                    if (debug) { log("Schedule Triggered für nächste Planzeit für Raum " + roomName, "info"); }
                                    TriggerUpdate(roomName);
                                });
                                

                                } // ende Funktion

                                ! ````

                                1 Reply Last reply Reply Quote 0
                                • P
                                  passuff last edited by

                                  @looxer01:

                                  @looxer01:

                                  Ich denke, dass ich es am Ende nochmal anders einbauen werde. (ohne Zufallszahlen) `

                                  Hi,

                                  ich habe mich des Themas nochmal angenommen da ich die Befürchtung habe, dass durch die Zufallszahlen auch Überschneidungen des Schedules vorkommen können. Die Wahrscheinlichkeit erhöht sich mit der Anzahl der zu planenden Räume.

                                  Daher habe ich jetzt folgendes implementiert:

                                  1. Die schedules werden mit einem Abstand von 2 Sekunden eingeplant

                                  2. Wenn es mehr als 28 zu heizende Räume gibt (wohl unwahrscheinlich, dann wird angefangen jede Sekunde zu planen

                                  3. erst ab 59 zu heizenden Räume gibt es Überschneidungen.

                                  Die Fälle 2 und 3 dürften wohl eher theoretisch sein.

                                  Wäre schön, wenn jemand testen könnte, ob die 2 Sekunden Abstand reichen. Ich habe bei mir damit kein Problem, hatte ich vorher aber auch nicht.

                                  Zum Testen einfach wieder die Funktion austauschen:

                                  ! ````
                                  //-----------------------------------------------------------------------------------------------------
                                  // Funktion ExecuteTempDetermination checkt ob eineThermostat/Raum Temperatur manuell angpasst wurde
                                  //-----------------------------------------------------------------------------------------------------
                                  function ExecuteTempDetermination(roomName, id) {
                                  var ActiveRoomProfile;
                                  var ScheduledSollTemp;
                                  ! // Findung des aktuellen RaumProfiles
                                  ActiveRoomProfile = ActiveProfile(roomName); // Ermittlung des aktiven Raumprofils
                                  //die geplante Soll Temperatur aus dem Raumschedule aus dem aktuellen Profil ermitteln
                                  ScheduledSollTemp = SelectSwitchTime(roomName, ActiveRoomProfile, "CurrSollTemp",id); // Ermittlung der geplanten Solltemperatur
                                  if (debug) {
                                  log("Routine ExecuteTempDetermination: raum " + roomName + "Solltemp nach Switchtime: " + ScheduledSollTemp + " Findung " + Source_SchedulePoint, "info");
                                  }
                                  // Schauen ob die ermittelte Temperatur angepasst werden muss z.B. party Gaeste etc
                                  ScheduledSollTemp = OverruleSollTemp(roomName, ActiveRoomProfile, ScheduledSollTemp, id); //Global und Profilparameter koennen den schedule uebersteuern
                                  if (debug) {
                                  log("Routine ExecuteTempDetermination: raum " + roomName + "Solltemp nach overrule: " + ScheduledSollTemp+ " Findung " + Source_GlobalParameter, "info");
                                  }
                                  ! // jetzt die Temperatur dem Thermostat uebermitteln
                                  SetTemp(roomName, ScheduledSollTemp, id, true); // jetzt die Temperatur schalten
                                  ! if (NextSchedules[roomName]) {
                                  if (debug) { log("Schedule gelöscht für " + roomName, "info"); }
                                  clearSchedule(NextSchedules[roomName]);
                                  NextSchedules[roomName] = null;
                                  }
                                  // jetzt Delay-Sekunden ermitteln, um die Schedules nicht gleichzeitig auszuführen
                                  var delaysek=0;
                                  var z = 1;
                                  for (var roomCheck in rooms) { // loop ueber all Raeume
                                  roomCheck = roomCheck.replace(/\s/g, "_"); // Blanks durch unterstrich ersetzen
                                  if ( roomCheck === roomName) {
                                  delaysek = z * 2; // es werden alle 2 Sekunden ein schedule geplant also 2,4,6....
                                  if (delaysek > 58) { // jetzt sind 58 Sekunden erreicht
                                  delaysek = (delaysek - 59) * 2 - 1 ; // also mit 1,3,5... Sekunden weiter planen
                                  }
                                  if ( z > 59) { // mehr als 59 Räume mit Thermostaten? wohl kaum
                                  delaysek = 0;
                                  }
                                  break;
                                  }
                                  z = z + 1
                                  }//endfor roomcheck

                                  // jetzt die Cron Pattern bestimmen und einplanen
                                  var schedArr = Source_SchedulePoint.split("_"); // [0]=Mo, [1]=00:00:00
                                  schedArr[1] = schedArr[1].substr(0,6) + delaysek;
                                  var nextSchedule = parseInt(schedArr[1].substr(6, 2), 10) + " " + parseInt(schedArr[1].substr(3, 2), 10) + " " + parseInt(schedArr[1].substr(0, 2), 10) + " * * *";
                                  if (debug) { log("Setze Schedule für nächste Planzeit " + nextSchedule + " für Raum " + roomName, "info"); }
                                  NextSchedules[roomName] = schedule(nextSchedule, function() {
                                      if (debug) { log("Schedule Triggered für nächste Planzeit für Raum " + roomName, "info"); }
                                      TriggerUpdate(roomName);
                                  });
                                  

                                  } // ende Funktion

                                  ! ```` `

                                  führt bei mir zu folgenden Fehlermeldungen:

                                  13:15:49.049 [error] javascript.0 at ManAdjustments (script.js.common.Heizungssteuerung:1034:68)

                                  13:15:49.049 [error] javascript.0 at LoopDevices (script.js.common.Heizungssteuerung:863:18)

                                  13:15:49.049 [error] javascript.0 at LoopRooms (script.js.common.Heizungssteuerung:763:13)

                                  13:15:49.050 [error] javascript.0 at Object. (script.js.common.Heizungssteuerung:419:9)

                                  1 Reply Last reply Reply Quote 0
                                  • L
                                    looxer01 last edited by

                                    @passuff:

                                    führt bei mir zu folgenden Fehlermeldungen: `

                                    Hi,

                                    Die Fehler sind leider nicht selbsterklärend. Sieht so aus, dass an der Stelle der Subscriptions was schief geht.

                                    Allerdings ist keine subscriptionsrelevante Aenderung in der Funktion angefasst worden. Daher bin ich da gerade ratlos.

                                    schick mir doch mal deine Programmversion. Schaue ich mir dann an.

                                    Hat sonst noch jemand Fehler mit der Funktion ?

                                    vG Looxer

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

                                      Hi,

                                      ich hatte jetzt auch wieder Probleme mit dem automatischen Umschalten.

                                      Ich habe das Gefühl, das die ganzen Subscriptions (zusammen mit vielen anderen) für die eine JavaScript-Instanz zu viel war.

                                      Habe Dein Script jetzt auf einem eigenen ioBroker-Host (Multihost-Umgebung) mit eigener JS-Instanz umgezogen. Mal sehen, wie es jetzt läuft.

                                      Gruß,

                                      Eric

                                      1 Reply Last reply Reply Quote 0
                                      • L
                                        looxer01 last edited by

                                        @eric2905:

                                        ich hatte jetzt auch wieder Probleme mit dem automatischen Umschalten. `
                                        Hi Eric,

                                        ich vermute eher, dass es daran liegt, dass eben auch zufällig Schedules gleichzeitig liegen können. (Zufallsfunktion)

                                        Daher habe ich die Funktion angepasst und die Verschiebung ist jetzt für jeden Raum immer Gleich.

                                        Also z.B. Schlafzimmer hat dann immer plus 8 Sekunden.- Abhängig von der Position des Raumes in der Raumliste.

                                        (4.Position z.B. mal 2 Sekunden = 8 Sekunden)

                                        Die Subscriptions an sich bzw die schedules sollten nicht wirklich Performance Probleme auslösen.

                                        Daher glaube ich eher, dass es an Schedule-Überschneidungen liegt.

                                        Hast du schon die neue Funktion probiert. Läuft die ohne Fehler bei dir ?

                                        Ich weiss auch nicht ob die 2 Sekunden Abstand ausreichend sind. Daher wäre ein Test klasse.

                                        vG Looxer

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

                                          Hi,

                                          die neue Funktion läuft ohne Probleme, sofern der Raum überhaupt „angesprungen“ wurde.

                                          Mittels Pushover habe ich Verschiebungen gesehen, aber es fehlten ab und an halt wieder mal Räume.

                                          Da ich über 40 Scripte auf der einen JS-Instanz laufen habe (die nimmt sich über 150 MB RAM), denke ich eher an ein Problem in Richtung „zu viel Subscriptions“, o.ä.

                                          Mal sehen, wie es sich jetzt verhält.

                                          Gruß,

                                          Eric

                                          1 Reply Last reply Reply Quote 0
                                          • P
                                            passuff last edited by

                                            @passuff:

                                            führt bei mir zu folgenden Fehlermeldungen:

                                            13:15:49.049 [error] javascript.0 at ManAdjustments (script.js.common.Heizungssteuerung:1034:68)

                                            13:15:49.049 [error] javascript.0 at LoopDevices (script.js.common.Heizungssteuerung:863:18)

                                            13:15:49.049 [error] javascript.0 at LoopRooms (script.js.common.Heizungssteuerung:763:13)

                                            13:15:49.050 [error] javascript.0 at Object. (script.js.common.Heizungssteuerung:419:9) `

                                            Sorry, war ein copy & paste Fehler. Das Skript funktioniert.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            762
                                            Online

                                            31.6k
                                            Users

                                            79.5k
                                            Topics

                                            1.3m
                                            Posts

                                            climate heating javascript template
                                            115
                                            1127
                                            318671
                                            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