NEWS
[Vorlage] Heizungsthermostatsteuerung 2.1 - Script
-
Also, ich habe heute wieder mal etwas experimentiert, aber leider führen beide Lösungswege nicht zum Erfolg.
Bei deinem Lösungsvorschlag, kann ich Zeitlich gesehen ja nicht alle ( sagen wir einfach einmal ) 15 Minuten auf den Regler schreiben. Da man ja immer warten müsste bis eine neue Temp seitens deines Wochenprogrammes angewählt wird.
Deinen Lösungsansatz habe ich auch versucht, jedoch funktioniert dann das Heizungsscript nicht mehr, da er keine Regler erkennt.
-
Bei deinem Lösungsvorschlag, kann ich Zeitlich gesehen ja nicht alle ( sagen wir einfach einmal ) 15 Minuten auf den Regler schreiben. Da man ja immer warten müsste bis eine neue Temp seitens deines Wochenprogrammes angewählt wird. `
Wieso musst du warten auf die Umschaltung der Temperatur des Planes ? Du kannst jederzeit eine manuelle Temp setzen.Nur wird diese zum nächsten Schaltpunkt wieder zurückgesetzt. Daher die Idee das über eine subscription zu machen.
So kannst du abhängig von deiner Logik eine Temp setzen oder nicht, und zwar auch zum Zeitpunkt wenn die nächste Temp wieder vom Script gesetzt wurde.
vG Looxer
-
Deinen Lösungsansatz habe ich auch versucht, jedoch funktioniert dann das Heizungsscript nicht mehr, da er keine Regler erkennt. `
Das kann ich zwar nicht nachvollziehen, aber dann versuche mal die brachiale Methode mit Austausch der stateId vor Zeile 494.if(stateId == 'hm-rpc.1.OEQ1712335.4.MANU_MODE') stateId = 'javascript.0.Heizung.Schlafzimmer.Solltemperatur'; setState(stateId, val);
Ich denke, dass an "MANU_MODE" und nicht an "SET_TEMPERATURE" gesendet wird ?
-
Also ich hab es jetzt einmal so:
Bei deinem Lösungsvorschlag, kann ich Zeitlich gesehen ja nicht alle ( sagen wir einfach einmal ) 15 Minuten auf den Regler schreiben. Da man ja immer warten müsste bis eine neue Temp seitens deines Wochenprogrammes angewählt wird. `
Wieso musst du warten auf die Umschaltung der Temperatur des Planes ? Du kannst jederzeit eine manuelle Temp setzen.Nur wird diese zum nächsten Schaltpunkt wieder zurückgesetzt. Daher die Idee das über eine subscription zu machen.
So kannst du abhängig von deiner Logik eine Temp setzen oder nicht, und zwar auch zum Zeitpunkt wenn die nächste Temp wieder vom Script gesetzt wurde.
vG Looxer `
So sieht mein Regelscript momentan aus, anders bekomme ich es leider nicht hin. Ich stell mich da wohl zu sehr an. Bei dem Regelscript hat mir paul53 schon sehr geholfen.Es wartet und wenn eine "0" gemeldet wird, sagt er das auch in der LOG, jedoch schickt das Script dann erst nach der eingestellten Zeit ( 10 Minuten ) den neuen Wert an dein Heizscript.
! ````
// PI-Regler Raumheizung für Kaskade Raumsensor - HKT-Temperatur
! var idHeizscript = 'javascript.0.Heizung.Heizplan.Schlafzimmer.View_Manually_Adjusted';
! // Trigger neue temperatur
on(idHeizscript, function (obj) {
if (obj.state.val === 0) {
log('Trigger neue Temperaturvorgabe');
}
});
! // P-Band in K, Nachstellzeit in s
const Xp = 4;
const Tn = 2400; // 120 entspricht 30 Sekunden
! const yid = 'javascript.0.Heizung.Heizplan.Schlafzimmer.View_Manually_Adjusted'; // neue Temperaturvorgabe ( Ausgang PI-Regler ) an Heizscript
const xid = 'hm-rpc.1.CUX1200001.1.TEMPERATURE'; // gemessene Temperatur ( Sensor ) Extern
const wid = 'javascript.0.Heizung.Heizplan.Schlafzimmer.Source_Last_Temp'; // gesetzte Temperatur ( Heizungsscript ) von Heizscript
! 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;
}
}
!@paul53: Meinst du diesen Absatz hier im Heizungsscript? >! ```` function subscribeUserTab() { for (var x in UserExitTab ) { if (UserExitTab[x][0] === "initial" ) { continue; } var subscribeObj = {id: UserExitTab[x][0]}; switch (UserExitTab[x][2]) { case "valNe": case "valGt": case "valGe": case "valLt": case "valLe": case "val": subscribeObj[UserExitTab[x][2]] = UserExitTab[x][3]; break; case "any": subscribeObj.change = "any"; break; } on(subscribeObj, function(obj) { UserExitPrep(obj.id, obj.state.val); }); // ende on id } // Endfor }
Zeile 494 wäre dann folgender Absatz (Zeile 489 - 493):
!
function subscribeUserTab() { for (var x in UserExitTab ) { if (UserExitTab[x][0] === "initial" ) { continue; } !
Ich weis, ich kann nervig sein, aber ich bin für eure große Hilfe wirklich dankbar, da ich mich dafür wirklich interessiere, aber leider noch sehr am lernen bin. Ich kann mich nur immer wieder bei euch bedanken.
-
Meinst du diesen Absatz hier im Heizungsscript? `
Nein, anscheinend haben sich durch die Anpassung an die eigenen Gegebenheiten die Zeilennummern zu sehr verändert. Suche einfach nachsetState(stateId
und füge vor der Zeile
setState(stateId, val); ````den Austausch der ID ein
if(stateId == 'hm-rpc.1.OEQ1712335.4.MANU_MODE') stateId = 'javascript.0.Heizung.Heizplan.Schlafzimmer.Source_Last_Temp';
Im Skript für den Hauptregler der Kaskade sende dann direkt an den HKT, indem Du die richtige ID vorgibst.
const yid = 'hm-rpc.1.OEQ1712335.4.MANU_MODE'; // neue Temperaturvorgabe ( Ausgang PI-Regler ) an HKT
-
So sieht mein Regelscript momentan aus, anders bekomme ich es leider nicht hin. Ich stell mich da wohl zu sehr an. Bei dem Regelscript hat mir paul53 schon sehr geholfen.Es wartet und wenn eine "0" gemeldet wird, sagt er das auch in der LOG, jedoch schickt das Script dann erst nach der eingestellten Zeit ( 10 Minuten ) den neuen Wert an dein Heizscript. `
Hi,
mein Verständnis über das was du erreichen willst
-
Ausgangspunkt ist der Wochenheizpolan
-
Du machst Anpassungen an der aktuellen Temperatur
-
und willst diese als aktuelle SollTemp verwenden
-
gleichzeitig willst du die Funktionatäten des scriptes nutzen (Anwesenheiten, Urlaub, ICAL)
Es gibt zwei Möglichkeiten das zu erreichen
1. Ich mache ein paar Anpassungen damit die manuell gesetzte Temp erhalten bleibt und Anwesenheit etc noch funktiuoniert
Nachteil: manuelle Temperaturen (am Thermostat eingestellt) werden nicht funktionieren. Das zusätzlich zu machen ein hoher Aufwand
2. Du nutzt den aktuellen ZeitSlot (und sicherst die geplante Temp weg und ersetzt diese mit deiner neuen.) Nach Ablauf der Temp speicherst du die gesicherte Temp im abgelaufenen Slot und so weiter.
Nachteil: erfordert mehr Programmierung auf deiner Seite
was meinst du ?
vG Looxer
-
-
Meinst du diesen Absatz hier im Heizungsscript? `
Nein, anscheinend haben sich durch die Anpassung an die eigenen Gegebenheiten die Zeilennummern zu sehr verändert. Suche einfach nachsetState(stateId
und füge vor der Zeile
setState(stateId, val); ````den Austausch der ID ein
if(stateId == 'hm-rpc.1.OEQ1712335.4.MANU_MODE') stateId = 'javascript.0.Heizung.Heizplan.Schlafzimmer.Source_Last_Temp';
Im Skript für den Hauptregler der Kaskade sende dann direkt an den HKT, indem Du die richtige ID vorgibst.
const yid = 'hm-rpc.1.OEQ1712335.4.MANU_MODE'; // neue Temperaturvorgabe ( Ausgang PI-Regler ) an HKT
```` `
Ich hab das von dir einmal versucht, jedoch wenn man den Regler aus dem Heizscript nimmt ( aus dem Gewerk Heizung ), dann läuft das Heizscript nicht mehr. Und die Temperatur wird auf "4.SET_TEMPERATURE" gesetzt.
Frage mich aber gerade, wie ich an beide Regler senden kann? Da steh ich nach vielen Versuchen am Schlauch :roll:
So sieht mein Regelscript momentan aus, anders bekomme ich es leider nicht hin. Ich stell mich da wohl zu sehr an. Bei dem Regelscript hat mir paul53 schon sehr geholfen.Es wartet und wenn eine "0" gemeldet wird, sagt er das auch in der LOG, jedoch schickt das Script dann erst nach der eingestellten Zeit ( 10 Minuten ) den neuen Wert an dein Heizscript. `
Hi,
mein Verständnis über das was du erreichen willst
-
Ausgangspunkt ist der Wochenheizpolan
-
Du machst Anpassungen an der aktuellen Temperatur
-
und willst diese als aktuelle SollTemp verwenden
-
gleichzeitig willst du die Funktionatäten des scriptes nutzen (Anwesenheiten, Urlaub, ICAL)
Es gibt zwei Möglichkeiten das zu erreichen
1. Ich mache ein paar Anpassungen damit die manuell gesetzte Temp erhalten bleibt und Anwesenheit etc noch funktiuoniert
Nachteil: manuelle Temperaturen (am Thermostat eingestellt) werden nicht funktionieren. Das zusätzlich zu machen ein hoher Aufwand
2. Du nutzt den aktuellen ZeitSlot (und sicherst die geplante Temp weg und ersetzt diese mit deiner neuen.) Nach Ablauf der Temp speicherst du die gesicherte Temp im abgelaufenen Slot und so weiter.
Nachteil: erfordert mehr Programmierung auf deiner Seite
was meinst du ?
vG Looxer `
Du hast soweit alles korrekt verstanden, jedoch setzte ich die Temperatur nicht nur einmal, sonder alle 5 Minuten.
Da ich Programmiertechnisch nicht fit bin, tue ich mich noch relativ schwer :shock:
Ich denke, dass man auf die am Regler gesetzte manuelle Temp verzichten kann, da ich am Regler selbst händisch nichts ändere, sondern alles über io.Broker laufen lasse.
Aktuell habe ich die Scriptänderung von @paul53 eingebaut und setzte durch mein anderes Script die Temperatur direkt auf den Regler. Dadurch erfährt dein Script das. Einziges Manko bis jetzt ist, dass bei einem Tempwechsel durch das Wochenprogramm 5 Minuten Leerlaufzeit statt findet, bis mein anderes Script die Temp wieder zum Regler schickt. Da ich nun einen zweiten Regler mit eingebunden habe, wird die neue Temp auch an diesen gesendet. Ich werde dies heute mal so laufen lassen. Da ich Beruflich gerade eingespannt bin, melde ich mich zeitnah wieder.
-
-
Also, ich schreibe mal ein kleines Update, denn ich habe Gestern mal wieder etwas Zeit zum "basteln" gehabt.
Ich habe das Update von @looxer01 gerade eingespielt und lasse nun testweise alles laufen.
Den Vorschlag von Paul53 habe ich ins Heizscript aufgenommen und somit alle SET_TEMPERATURE aller Regler ausgegrenzt.
! ````
//-----------------------------------------------------------------------------------------------------
// Wird verwendet um State-Werte zu setzen, merkt sich wenn ein eigener State geändert wurde,
// um das später ignorieren zu können
//-----------------------------------------------------------------------------------------------------
function setOwnState(stateId, val) {
if (stateId.indexOf(path) !== -1 && cron === 0) {
if (! ownStateChanges[stateId]) ownStateChanges[stateId] = 1;
else ownStateChanges[stateId]++;
}
if(stateId == 'hm-rpc.0.OEQ1712335.4.SET_TEMPERATURE') stateId = 'javascript.0.Heizung.Heizplan.Schlafzimmer_test_paul53.Source_Last_Temp';
if(stateId == 'hm-rpc.0.OEQ1704782.4.SET_TEMPERATURE') stateId = 'javascript.0.Heizung.Heizplan.Schlafzimmer_test_paul53.Source_Last_Temp';
setState(stateId, val);Ich lasse meinen Regler jetzt den neuen Temp-Wert auf eine Systemvariable in die CCU2 übertragen und ein Script in der CCU2 übernimmt das setzten der Temperaturen zu den Heizthermostaten. ( Damit wären auch die Übertragungsfehler seitens der CCU2 behoben, die ich ab und an hatte ) Mir ist nur folgende Bedeutung noch nicht so richtig klar, was da eigentlich gemacht wird mit der Zeile: >! ```` if(stateId == 'hm-rpc.0.OEQ1712335.4.SET_TEMPERATURE') stateId = 'javascript.0.Heizung.Heizplan.Schlafzimmer_test_paul53.Source_Last_Temp';
Ein weiteres Script überprüft nun alle 30 Minuten, vergleicht die Aussentemperatur mit einem fest gewählten Schwellpunkt und setzt dann den Datenpunkt "javascript.0.Heizung.Heizplan.GlobaleParameter.Heizperiode" entweder auf "true" oder auf "false". Wenn die Heizperiode wieder eingeschalten wird, wird zudem mit einer Verzögerung von 1000 ms der Datenpunkt "View_Manually_Adjusted" auf Null gesetzt. Somit beginnt das Heizscript einmal alles einzulesen ( was ich von der LOG so verstanden habe ). Diesen Datenpunkt "View_Manually_Adjusted" setzte ich deswegen auf Null, da es gestern beim Wechsel der Heizperiode von FALSE auf TRUE Probleme gab und das Heizscript nichts mehr gemacht hat. ( eventuell gelöst durch die neue Version )
Script Heizperiode Sommer/Winter: ( hab ich leider nur mittels Blockly so hinbekommen )
!
schedule("*/30 * * * *", function () { if (getState("hm-rpc.1.CUX1300001.1.TEMPERATURE").val < getState("javascript.0.Heizung.Heizplan.GlobaleParameter.Vorgabe_Heizplanabschaltung_über_Aussentemperatur").val) { // Heizperiode Aktivieren setState("javascript.0.Heizung.Heizplan.GlobaleParameter.Heizperiode"/*Wenn Heizperiode dann Aktivierung der Heizplaene*/, true); // Heizplan Schlafzimmer "Manuelle" Temperatur auf "0" setzten, um Heizscript neu zu starten if (getState("javascript.0.Heizung.Heizplan.GlobaleParameter.Heizperiode").val == false) { setStateDelayed("javascript.0.Heizung.Heizplan.Schlafzimmer.View_Manual_Temp_Duration"/*Gueltigkeit in Minuten fuer manuelle Temperatur Aenderung*/, 0, true, 1000, false); console.log('Heizplan: "Manuelle" Temperatur auf "0" gesetzt'); } console.log('Heizperiode AN'); } else if (getState("javascript.0.Heizung.Heizplan.Schlafzimmer.View_Manually_Adjusted").val >= getState("javascript.0.Heizung.Heizplan.GlobaleParameter.Vorgabe_Heizplanabschaltung_über_Aussentemperatur").val) { // Heizperiode Deaktivieren setState("javascript.0.Heizung.Heizplan.GlobaleParameter.Heizperiode"/*Wenn Heizperiode dann Aktivierung der Heizplaene*/, false); console.log('Heizperiode AUS'); } }); !
-
Update:
Es gab noch ein kleines Problem mit meiner Abschaltung über die Aussentemp, dies hab ich gefixt und es klappt nun.
Des weiteren, gibt es noch ein kleines Problem, dass das Heizscript ja die manuelle Temp aus dem Regler wieder liest und dann den Zeitstempel auf den aktuellen Zeitabschnitt legt.
-
Update:
Es gab noch ein kleines Problem mit meiner Abschaltung über die Aussentemp, dies hab ich gefixt und es klappt nun.
Des weiteren, gibt es noch ein kleines Problem, dass das Heizscript ja die manuelle Temp aus dem Regler wieder liest und dann den Zeitstempel auf den aktuellen Zeitabschnitt legt.
filename="View.png" index="0">~~ `
Hi.
Dazu hatte ich ja vorher schon geschrieben. Schau dir das bitte nochmal an.
Vg looxer
Gesendet von meinem SM-G965F mit Tapatalk
-
Hi @looxer01,
gibt es da auch eine Möglichkeit die heizperiode pro thermostat an bzw aus zu stellen ?
Im moment haben wir ja den globalen wert der sich dan auf alle auswirkt, in meiner situation möchte ich aber gerne bestimmte räume welche nicht benutzt werden für ein par tagen nicht beheizen.
Gr,
Dutch
-
Hi Dutch,
gibt es da auch eine Möglichkeit die heizperiode pro thermostat an bzw aus zu stellen ? `
dazu faellt mir nur ein Workaround im Moment ein.Ueber ICAL und setzen eines Party Events mit z.B. 3 Grad Absenkungstemperatur der jeweiligen Räume könnte das gemacht werden.
Alle andere Räume muessten dann eine Absenkung von null haben. Ist aber nur ein Workaround.
Das Einbauen dieser Funktion wäre natürlich möglich. Müsste ich mir mal genauer ansehen.
Willst du erstmal den Workaround testen ?
vG Looxer
-
Wäre nicht auch ein 2. Wochenprofil eine Lösung?
Grüße Brati
Von unterwegs gesendet…
-
Wäre nicht auch ein 2. Wochenprofil eine Lösung? `
Hi Brati,na klar. Vielleicht besser aber auch etwas aufwändiger.
Das Profil kann manuell oder per ICAL aktiviert werden.
Durch entsprechende Einstellung brauch auch nur eine einzige Temp geändert werden.
vG Looxer
-
Noch ein Punkt zur Funktionalität der Heizperiode.
Wenn die Heizperiode ausgeschaltet wird, dann wird die Temp auf die vordefinierte Temp gesetzt um die Ventile zu öffnen und zu schliessen.
Unschön ist es, wenn die Ventile geöffnet werden sollen und Fensterverschluesse dann immer wieder zur Absenkung führen.
Daher habe ich meine SommerTemp auf 12 Grad gesetzt. (Temp bei geöffneten Fenstersensoren) Die Thermostate sind dann gesamten Sommer über ruhig und nicht unnotig Batterieenergie.
Im Profil kann aber natürlich ebenfalls z.B. 12 Grad hinterlegt werden.
vG Looxer
-
Hmm wochenprofiel währe wohl die beste lösung das stimmt damit gehts
–-----------------------
Send from mobile device
Das schöne ios hat Auto Korrektur zum k****
Wer Schreibfehler findet darf sie behalten oder auf eBay verkaufen, mindest Umsatz 10% für die community
-
Update:
Es gab noch ein kleines Problem mit meiner Abschaltung über die Aussentemp, dies hab ich gefixt und es klappt nun.
Des weiteren, gibt es noch ein kleines Problem, dass das Heizscript ja die manuelle Temp aus dem Regler wieder liest und dann den Zeitstempel auf den aktuellen Zeitabschnitt legt.
View.png `
Hi.
Dazu hatte ich ja vorher schon geschrieben. Schau dir das bitte nochmal an.
Vg looxer
Gesendet von meinem SM-G965F mit Tapatalk `
Hallo looxer01,
Aktuell mal muss ich glücklicherweise sagen, dass alles sauber seit 2 Tagen durchläuft. Die HKT werden sauber geregelt, die Ab - und Zuschaltung über Aussentemperatur funktioniert tadellos und auch die sonstigen Funktionen ( die für mich persönlich relevant sind ) funktionieren einwandfrei.
Ich wolle mich persönlich bei @looxer01 und @paul53 noch für die tatkräftige Unterstützung und für das behalten der Nerven bedanken :lol:
Natürlich werde ich das hier gelernte auch für andere bereit stellen und diese unterstützen.
Sollte jemand das Script für die Ab - und Zuschaltung mittels Aussentemp benötigen kann sich gerne melden.
-
atürlich werde ich das hier gelernte auch für andere bereit stellen und diese unterstützen. `
Danke dir Quorle,Freut mich, dass es jetzt bei dir laeuft.
jede Unterstützung hier ist hoch willkommen.
vG Looxer
-
Wollte euch hier nun einmal die Regelung mittels des Heizscriptes, dem PI-Regler und dem Script für die Abschaltung über die Aussentemperatur zeigen. Nun heißt es nur doch "Optimierungen".
-
Ich habe ein Problem mit dem View.
Ein einzelnes View (in meinem Fall das vom Wohnzimmer) geht. Aber jedes weiter liefert nur eine Anzeige wie auf dem Bild.
Die Objekte für den Staus habe ich angepasst aber weder im Profil unten noch an verschiedenen anderen Stellen wird etwas angezeigt.Dort erscheinen immer nur Fehler. Ich habe jetzt schon seit Stunden probiert aber es will einfach nicht. Im Editor Fenster werden komischer weiße die Werte angezeigt.
6144_problem.png