@helge939:
Hallo Zusammen ,
ich habe mir mit blockly ein Script für die Heizungssteuerung gebaut und komme hier bei zwei Problemen nicht weiter:
-
die Telegramm Nachrichten kommen doppelt, scheint das das Script doppelt durchlaufen wird?
-
ich möchte über einen manuellen Datenpunkt (wenn kein Urlaub aktiviert wurde) durch manuelle Temperaturen ersetzen, habe aber keine Idee wie ich dies umsetzen kann.
Bin für jeden Hinweis dankbar.
matze
var timeout6, Feiertag, Werktag, Heizung_Temperatur_Anwesenheit, Heizung_Temperatur_Abwesend, Anwesenheit_Werktag, Anwesenheit_kein_Werktag, timeout, timeout2, timeout3, timeout4, timeout5;
on({id: new RegExp('mihome\\.0\\.devices\\.magnet_158d0001c224b5\\.state' + "|" + 'mihome\\.0\\.devices\\.weather_v1_158d000223a01d\\.temperature' + "|" + 'maxcube\\.0\\.Urlaubsmodus_Heizung' + "|" + 'maxcube\\.0\\.devices\\.thermostat_17af81\\.Wunschtemperatur_Wohnzimmer'), change: "ne"}, function (obj) {
// prüfen ob Urlaubsmodus oder Automatik
// Urlaubsmodus
if (getState("maxcube.0.Urlaubsmodus_Heizung").val == true) {
setState("maxcube.0.devices.thermostat_17af81.setpoint"/*Thermostat grosse Heizung setpoint*/, '15');
timeout6 = setTimeout(function () {
sendTo("telegram.0", "send", {
text: (['Urlaubsmodus Heizung wurde aktiviert, die Temperatur auf ',getState("maxcube.0.devices.thermostat_17af81.setpoint").val,' °C eingestellt.'].join(''))
});
setState("maxcube.0.devices.thermostat_17af81.Wunschtemperatur_Wohnzimmer_letzte"/*Wunschtemperatur_Wohnzimmer_letzte*/, parseFloat(getState("maxcube.0.devices.thermostat_17af81.setpoint").val), true);
}, 2000);
} else {
// Automatik
// prüfen was für eine Art Tag es ist
if (getState("feiertage.0.heute.boolean").val == true) {
Feiertag = true;
} else {
Feiertag = false;
}
if (formatDate(new Date(), "WW", "de") != 'Freitag' && formatDate(new Date(), "WW", "de") != 'Samstag' && formatDate(new Date(), "WW", "de") != 'Sonntag' && Feiertag == false) {
Werktag = true;
} else {
Werktag = false;
}
// Heizungstemperatur Variablen setzen
Heizung_Temperatur_Anwesenheit = '20';
Heizung_Temperatur_Abwesend = '17';
// Start Steuerung
// Status setzen Heizung
// Arbeitstag
if (Werktag == true && (new Date().getHours()) >= '5' && (new Date().getHours()) <= '8') {
Anwesenheit_Werktag = true;
} else if (Werktag == true && (new Date().getHours()) >= '15' && (new Date().getHours()) <= '22') {
Anwesenheit_Werktag = true;
} else {
Anwesenheit_Werktag = false;
}
// Fr. Sa. So. + Feiertag
if (Werktag == false && (new Date().getHours()) >= '5' && (new Date().getHours()) <= '22') {
Anwesenheit_kein_Werktag = true;
} else {
Anwesenheit_kein_Werktag = false;
}
sendTo("telegram.0", "send", {
text: (['Heizungsscript Variable Werktag: ',Werktag,', Variable Feiertag: ',Feiertag,', Variable Anwesenheit Werktag: ',Anwesenheit_Werktag,', Variable Anwesenheit kein Werktag: ',Anwesenheit_kein_Werktag,', Variable Heizung Temperatur Abwesend: ',Heizung_Temperatur_Abwesend,'°C',', Variable Heizung Temperatur Anwesend: ',Heizung_Temperatur_Anwesenheit,'°C'].join(''))
});
if (getState("mihome.0.devices.magnet_158d0001c224b5.state").val == true) {
// Fenster auf, dann immer 16 °C
setState("maxcube.0.devices.thermostat_17af81.setpoint"/*Thermostat grosse Heizung setpoint*/, 16);
timeout = setTimeout(function () {
setState("maxcube.0.devices.thermostat_17af81.Wunschtemperatur_Wohnzimmer_letzte"/*Wunschtemperatur_Wohnzimmer_letzte*/, parseFloat(getState("maxcube.0.devices.thermostat_17af81.setpoint").val), true);
}, 5000);
} else if (getState("mihome.0.devices.magnet_158d0001c224b5.state").val == false) {
// Werktag und anwesend
if (Werktag == true && Anwesenheit_Werktag == true) {
setState("maxcube.0.devices.thermostat_17af81.setpoint"/*Thermostat grosse Heizung setpoint*/, parseFloat(Heizung_Temperatur_Anwesenheit));
timeout2 = setTimeout(function () {
setState("maxcube.0.devices.thermostat_17af81.Wunschtemperatur_Wohnzimmer_letzte"/*Wunschtemperatur_Wohnzimmer_letzte*/, parseFloat(getState("maxcube.0.devices.thermostat_17af81.setpoint").val), true);
}, 5000);
// Werktag und abwesend
} else if (Werktag == true && Anwesenheit_Werktag == false) {
setState("maxcube.0.devices.thermostat_17af81.setpoint"/*Thermostat grosse Heizung setpoint*/, parseFloat(Heizung_Temperatur_Abwesend));
timeout3 = setTimeout(function () {
setState("maxcube.0.devices.thermostat_17af81.Wunschtemperatur_Wohnzimmer_letzte"/*Wunschtemperatur_Wohnzimmer_letzte*/, parseFloat(getState("maxcube.0.devices.thermostat_17af81.setpoint").val), true);
}, 5000);
// kein Werktag und anwesend
} else if (Werktag == false && Anwesenheit_kein_Werktag == true) {
setState("maxcube.0.devices.thermostat_17af81.setpoint"/*Thermostat grosse Heizung setpoint*/, parseFloat(Heizung_Temperatur_Anwesenheit));
timeout4 = setTimeout(function () {
setState("maxcube.0.devices.thermostat_17af81.Wunschtemperatur_Wohnzimmer_letzte"/*Wunschtemperatur_Wohnzimmer_letzte*/, parseFloat(getState("maxcube.0.devices.thermostat_17af81.setpoint").val), true);
}, 5000);
// kein Werktag und abwesend
} else if (Werktag == false && Anwesenheit_kein_Werktag == false) {
setState("maxcube.0.devices.thermostat_17af81.setpoint"/*Thermostat grosse Heizung setpoint*/, parseFloat(Heizung_Temperatur_Abwesend));
timeout5 = setTimeout(function () {
setState("maxcube.0.devices.thermostat_17af81.Wunschtemperatur_Wohnzimmer_letzte"/*Wunschtemperatur_Wohnzimmer_letzte*/, parseFloat(getState("maxcube.0.devices.thermostat_17af81.setpoint").val), true);
}, 5000);
}
}
}
});
// Fensterkontakt
// Raumtemperatur
// manueller Datenpunkt Urlaub
// Datenpunkt für manuelle Übersteuerung
```` `
Ich finde den Code verwirrend aber ich kenne Blockly auch nicht.
Würde es einfacher gestalten. Wozu die Timeouts viermal?
Temperatur=16 Grad
Anwesend ja/nein
Werktag ja/nein
Fenster offen ja/nein
Manueller Modus ja/nein
Urlaub, Abwesend und Fenster auf würde ich immer dieselbe Temp setzen.
Wenn manueller Modus dann Temp gesetzt aus Manuellem Datenpunkt
Sonst
Wenn anwesend dann
Wenn Werktag dann
Wenn Uhrzeit….
Sonst Temp = Grad
Sonst Temp = Grad
Wenn Uhrzeit....
Sonst Temp = Grad
Sonst Temp = 16 Grad
Wenn Fenster offen und Timer > 5 min dann temp = 16 Graf
Sonst Temperatur=16 Grad
Hoffe es ist verständlich. So ähnlich hatte ich es mal an meiner Homematic gelöst.