NEWS
[Vorlage] Heizungsthermostatsteuerung 2.1 - Script
-
Es wäre wirklich geschickter, auf eine State zu schreiben, die von deinem Script verwendet wird und dein Script auf den Regler schreibt. `
Hi,dann verstehe ich die Logik noch nicht so ganz. Manuelle Temp und Wochenplan sind ja 2 unterschiedliche Dinge.
Was soll denn das Kriterium sein für die Rückkehr vom Wochenplan ?
vG Looxer
-
Es wäre wirklich geschickter, auf eine State zu schreiben, die von deinem Script verwendet wird und dein Script auf den Regler schreibt. `
Hi,dann verstehe ich die Logik noch nicht so ganz. Manuelle Temp und Wochenplan sind ja 2 unterschiedliche Dinge.
Was soll denn das Kriterium sein für die Rückkehr vom Wochenplan ?
vG Looxer `
Guten Morgen,
Ich versuche es einmal zu erklären:
1. Dein Script ist der Hauptteil. Es setzt die Temperaturen über den Wochenplan
2. Ich greife die aktuelle einzustellende Temp von deinem Script ab und rechne die Temperatur um ( mittels eines anderen Scriptes )
3. Da dein Script die Temperatur zum Regler sendet, muss ich die neu errechnete Temp wieder in dein Script integrieren, somit kann dein Script die Temp wieder zum Regler senden und dein Script ganz normal weiter arbeiten.
4. Du sendest ja an einer Zentralen Stelle alle Temp´s zu den Reglern, dies müsste auf einen State gesetzt werden. Und ein weiteres State hinzugefügt werden wo dein Script noch eine neue Temp bekommt, die es dann anstatt der Tempvorgabe in deinem Script zum senden an den Regler nimmt.
Also kurz gesagt: Dein Script gibt die Tempvorgabe und sendet sie auf einem State, nennen wir ihn einmal AUSGANG, diesen AUSGANG verwende ich und schicke die verarbeitet Temp wieder auf einen State, nennen wir ihn EINGANG. Und erst dann schickt dein Script den EINGANG an die Regler. Somit sendet dein Script nur die Temp des State EINGANG an die Regler. Das ganze andere Script sollte unberührt weiter funktionieren.
Etwas kompliziert das ganze, aber ich versuche gerade eine Regelung aufzubauen.
-
3. Da dein Script die Temperatur zum Regler sendet, muss ich die neu errechnete Temp wieder in dein Script integrieren, somit kann dein Script die Temp wieder zum Regler senden und dein Script ganz normal weiter arbeiten. `
Der im PI-Regler-Script errechnete Sollwert sollte direkt zum Thermostaten gesendet werden, d.h. dieser Thermostat sollte aus dem Skript von @Looxer ausgeklammert werden (aus Gewerk entfernen). -
Also kurz gesagt: Dein Script gibt die Tempvorgabe und sendet sie auf einem State, `
Hi,also, dann sollte das so funktionieren.
Relevante Datenpunkte
die aktuell geplante Temperatur (lt Wochenplan) befindet sich in Feld: Source_Last_Temp
Die manuell eingegebene Temp befindet sich in Feld: View_Manually_Adjusted
Vorrausetzung:
Du stellst im View die Dauer der manuellen Temp auf "0". Damit wird erst beim nächsten Planwechsel eine neue Temp lt Wochenplan eingestellt.
1. Dein Programm nimmt die aktuell geplante Temp: Source_Last_Temp und errechnet die neue Temp nach deinen Vorgaben
2. Die von dir neu errechnete Temp wird von deinem Script in View_Manually_Adjusted eingestellt
3. Beim nächsten geplanten Wechsel setzt das Heizungsscript die View_Manually_Adjusted auf "0"
4. Über Subscription fängt dein script diese Aenderung ab (wenn auf null gesetzt) und startet erneut mit Schritt 1
oder hattest du das so schon probiert ?
vG Looxer
-
Hi,
in der letzten Zeit gab es ja ein paar Korrekturen zum Script.
Diese habe ich in Beta 03 Version 20b03 zusammengefasst.
ChangeLog:
// Version 2.00b03 02.04.2018 - dritte Beta //.............................Manuelle Temperaturen werden bei Scriptstart ignoriert/zurückgesetzt //.............................Thermostabtypetab Position 4 auf Position 8 (nach den Wandthermosteten) verschoben //.............................NoneHMTab - Fuellen der Position 12 in Controltab falsch (mit 0 ersetzt) //.............................Bei gleichen Zeiten im schedule von verschiedenen Räumen kam es dazu, dass nicht geschaltet wurde. Eine Zeitverzögerung eingebaut //.............................externe Dateiausgabe bei manuellen Aenderungen hinzugefügt (writelog) //.............................Fehler in Routine Sensor Change bei direktvernuepften Fenstersensoren beseitigt. //.............................Fehler bei den Subscriptions fuer Feiertage fuehrte zu Warnmeldungen, wenn kein Feiertagsadapter genutzt wurde //
Wer das Script bereits nutzt muss lediglich alles nach den Experteneinstellungen kopieren.
Alle Einstellungen können also aus der Vorversion übernommen werden.
Ich empfehle die vorherige Version eine zeitlang als Sicherung zu behalten. (deaktiviert natürlich)
Das angepasste Programm befindet sich, wie immer, im ersten Post und kann dort heruntergeladen werden.
vG Looxer
-
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