NEWS
(gelöst) Merkervariable inkrementieren - Absturz
-
Hallo zusammen,
ich versuche für meine Heizung folgendes Skript zu schreiben: Wenn die Heizung zweimal taktet, dann schalte die Heizung aus, wenn an zwei Temperaturmesspunkte es zu kalt wird, schalte die Heizung wieder ein. Das zweimal Takten versuche ich über eine Merkervariable zu lösen, wenn der Merker auf 2 gehen sollte, stürzt der JS Adapter ab...Hier mal das Skript (bitte noch von einigen Fragmenten irritieren lassen) und der Absturz dazu:
createState("javascript.0.Merker_Heizleistung", 0, {
name: "Merker_Heizleistung",
type: 'number'
});on({
id: "javascript.0.minutenZwischenBrennerStarts",
change: "ne"
}, async function (obj) {
var Element2 = (getState("javascript.0.Merker_Heizleistung").val)
// var Element3;
var Counterschleife = 0;
var Heat_on = (getState("km200.0.heatSources.flameStatus").val);
// var Leistungswert = (getState("km200.0.heatSources.powerSetpoint").val);
var Brennerstarts = (getState("javascript.0.minutenZwischenBrennerStarts").val);
// var Raumtemperatur = (getState("fritzdect.0.DECT_116300132384.celsius").val);
// Weitere Prüfung auf Heizprogramm, Programm soll nur laufen, wenn Heizung aktiv istif (Heat_on == 0) { //Prüfen ob Heizung an ist Counterschleife = 1; // Prüfung, ob Heizung Taktet, wenn ja, Heizleistung um 2 verringern. if (Brennerstarts <= 30) { Element2 += 1; setState("javascript.0.Merker_Heizleistung", (Element2), true); Counterschleife = 2; } else { Element2 = 0; setState("javascript.0.Merker_Heizleistung", (Element2), true); Counterschleife = 3; } while (Element2 >= 2) setState("km200.0.heatingCircuits.hc2.suWiSwitchMode", (1), true); Counterschleife = 4; } console.log(Heat_on); // console.log(Leistungswert2); // console.log(Leistungswert); console.log(Brennerstarts); // console.log(Raumtemperatur); console.log(Element2); // console.log(Element3); console.log(Counterschleife);
});
// Wenn Raumtemperatur aber unter 20 Grad ist, Heizleistung erhöhen,
// wenn Heizung taktet wird Heizleistung dennoch niedriger da Thermostate ausgedreht
on({
id: "fritzdect.0.DECT_087610334590.celsius",
change: "ne"
}, async function (obj) {
on({
id: "fritzdect.0.DECT_116300132384.celsius",
change: "ne"
}, async function (obj) {
// var Element2 = 1;
var Counterschleife = 0;
var Heat_on = (getState("km200.0.heatSources.flameStatus").val);
// var Leistungswert = (getState("km200.0.heatSources.powerSetpoint").val);
//var Brennerstarts = (getState("javascript.0.minutenZwischenBrennerStarts").val);
var Raumtemperatur_Mila = (getState("fritzdect.0.DECT_087610334590.celsius").val);
var Raumtemperatur2_Wohnz = (getState("fritzdect.0.DECT_116300132384.celsius").val);
// Weitere Prüfung auf Heizprogramm, Programm soll nur laufen, wenn Heizung aktiv istvar Zeit = new Date(); var Stunden = Zeit.getHours(); var Minuten = Zeit.getMinutes(); var Minuten_Tag = (Stunden * 60) + Minuten; var Heizprogramm_E = (getState("km200.0.heatingCircuits.hc2.switchPrograms.E").val); // getState("von allen Heizprogrammen") -> später, erst mal das Programm nehmen, welches durchgängig an ist. // getState("km200.0.heatingCircuits.hc2.activeSwitchProgram") wir später benötigt, wenn andere Heizprogramme auch aktiviert sind var temp = 300; //Heizprogramm_E[703]; // 300 Minuten ab Mitternacht -> 5 Uhr var temp_2 = 1200; //Heizprogramm_E[45]; // 1200 Minuten ab Mitternacht -> 20 Uhr geht Heizung aus //Testschleife zum auslesen des Inhaltes for (let i = 0, j = Heizprogramm_E.length; i < j; i++) { if (Heizprogramm_E[i] == "1200") { console.log("Stelle ist"[i]); } } // if X = X then read switchPrograms array and check against getMinutes, if Minutes = in switchProgramm setpoint check temperature // and switch the heat -> auch später, wenn andere Heizprogramme aktivert werden if (Heat_on == 1) { Counterschleife = 7; if (Minuten_Tag < temp && Minuten_Tag > temp_2) { Counterschleife = 5; if (Raumtemperatur_Mila < 21 && Raumtemperatur2_Wohnz <= 19) { setState("km200.0.heatingCircuits.hc2.suWiSwitchMode", (0), true) Counterschleife = 6; } } } console.log(Heat_on); console.log(Minuten_Tag); console.log(temp); console.log(temp_2); console.log(Heizprogramm_E.length); console.log(Raumtemperatur_Mila); console.log(Raumtemperatur2_Wohnz); console.log(Counterschleife); });
});
-
@mwolle könntest du das irgendwie verständlich in Code-Tags setzen? So werde ich da zumindest nicht schlau daraus. Sieht aber nach Endlosschleife aus?
-
@htrecksler ich habe den jetzt noch mal durch so ein "beautifyer" geschickt...viel besser wirds gerade nicht, aber schon besser als vorher, vlt kannst du schon was sehen?
-
@mwolle keiner eine Idee was der Fehler sein könnte?
-
Ohne das du das komplette Skript sauber in Code tags packst ist es praktisch nicht lesbar.
Ansonsten hängt das Skript an dieser Stelle bereits:
while (Element2 >= 2) setState("km200.0.heatingCircuits.hc2.suWiSwitchMode", (1), true);
Aus diesem code-Teil kommt das Skript nie heraus, da während der While schleife der Wert "Element2" nie verändert wird. Damit bekommst du bei jedem Trigger der in diesen Code-Teil läuft eine Funktion die nicht beendet wird.
Dementsprechend geht Dir irgendwann der heap aus.
A.
-
@asgothian ja aber das war tatsächlich die richtige Stelle, ich habe die while Schleife ausgetauscht und der Fehler tritt nicht mehr auf.
Wie geht das mit dem Code-Tags? Ich habe ja den Quellcode aus dem Editor kopiert... -