So ich habe es jetzt hinbekommen. Meine 30 Jahre alte Buderus Öl Heizungsanlage ist im Automatik Betrieb kaputt. Was noch geht, ist der Handbetrieb.
Das bedeutet die Anlage läuft durch und zieht das Öl in kürzester Zeit aus dem Tank. Ich habe die Leitung für den Handbetrieb gekappt und den Shelly dazwischen gepackt.
Auch die Pumpe für die WW Beladung hängt da dran. Hintergrund ist das die Pumpen immer laufen.
Das führt dazu das der WW Tank mit der Zeit wieder entladen wird und die Wärme an den Kessel abgibt.
Jetzt habe ich den Shelly Plus 1 mit Addon und drei Temperatur Fühlern für WW Temp., Außen Temp., und Temperatur am Rücklauf.
Hintergrund ist das ab einem Schwellenwert nicht geheizt werden soll. Im Sommer ergibt das keinen Sinn.
Daher ab 18 kein Heizungsbetrieb. Und Warmwasser soll nur 3 mal pro Tag Beladen werden aber nur wenn der Tank unter 37 Grad ist. Über 47 Grad soll die Beladung aufhören.
Mit sinkender Temperatur muss auch öfters geheizt werden Hier habe ich Intervalle für einen Außentemperaturbereich angelegt.
Und jede Menge Sonder Fälle
let schedulerTimer = Timer.set(60000, true, function() { // Alle 3 Sekunden
let minTemp = 0; // Minimum Außentemperatur
let maxTemp = 18; // Maximum Außentemperatur
let startWaterTemp = 36; // Unter 36 grad und Heizeit eingetreten, dann WW Laden
let stopWaterTemp = 47; // Über 36 grad stoppen
let returnFlowTempMin = 38; // unter diesem Wert überhaupt erst heizen!
// Temperaturfühler: Werte für Außentemperatur, Rücklauftemperatur und Wassertanktemperatur auslesen
let waterTankTemp = Shelly.getComponentStatus('Temperature', 100).tC; // Warmwassertanksensor
let returnFlowTemp = Shelly.getComponentStatus('Temperature', 101).tC; // Rücklaufsensor
let outdoorTemp = Shelly.getComponentStatus('Temperature', 102).tC; // Außentemperatursensor
// Prüfen ob die Anlage läuft
let currentSwitchStatus = Shelly.getComponentStatus('switch', 0).output; // An oder Aus!
let currentTime = Shelly.getComponentStatus('sys').time; // Uhrzeit
// Püfen ob eine Heizzeit für den Warmwassertank eingetreten ist.
function isWaterHeatingTime() {
let waterHeatingTimes = [{
start: "06:00",
end: "07:00"
},
{
start: "16:00",
end: "17:00"
},
{
start: "20:00",
end: "21:00"
}
];
let now = new Date();
let currentTime = now.getHours() + ":" + (now.getMinutes() < 10 ? "0" : "") + now.getMinutes();
for (let i = 0; i < waterHeatingTimes.length; i++) {
print("Intervall for Water Heating " + waterHeatingTimes[i].start);
if (currentTime >= waterHeatingTimes[i].start && currentTime <= waterHeatingTimes[i].end) {
print("TimeFound" + waterHeatingTimes[i].start);
return true;
}
}
return false;
}
// Funktion zur Überprüfung, ob die aktuelle Zeit innerhalb der Heizzeiten liegt
function isHeatingTime(currentTime, outdoorTemp) {
outdoorTemp = Math.floor(Number(outdoorTemp));
console.log("OutdoorTemp: " + outdoorTemp);
const minTemp = 0,
maxTemp = 18;
const tempRanges = [2, 5, 8, 12, 14, 18];
const intervalCounts = [12, 6, 4, 3, 2, 1]; // Intervalle pro Tag
const startTime = "2:00";
if (outdoorTemp > maxTemp) {
console.log("outdoorTemp over maxTemp");
return false;
}
let intervals = intervalCounts[intervalCounts.length - 1]; // Default max Intervall
for (let i = 0; i < tempRanges.length; i++) {
if (outdoorTemp <= tempRanges[i]) {
intervals = intervalCounts[i];
break;
}
}
// Intervall muss größer Null sein
if(intervals > 0){
console.log("intervall: " + intervals);
}else{
return false;
}
const intervalDuration = Math.floor(24 / intervals); // Stunden pro Intervall, ohne Nachkommastellen
let startArray = startTime.split(":");
let startHour = startArray[0];
startHour = Number(startHour); // in Zahlen umwandeln
// CurrentTime in Stunden und Minuten umwandeln
let currentArray = currentTime.split(":");
let currentHour = currentArray[0];
currentHour = Number(currentHour); // in Zahlen umwandeln
if(currentHour == 00){
currentHour = 0;
}
// Prüfe die Intervalle
for (let i = 0; i < intervals; i++) {
console.log("StartHeating: " + startHour + ", CurrentHour: " + currentHour);
// Check, ob currentTime im Intervall liegt
if (currentHour == startHour) {
return true;
}
// Nächstes Intervall
startHour = (startHour + Math.floor(intervalDuration)) % 24;
}
return false;
}
let isWaterHeatingTime = isWaterHeatingTime();
let isHeatingTime = isHeatingTime(currentTime, outdoorTemp);
print("Warmwasser: " + isWaterHeatingTime);
print("Heizen: " + isHeatingTime);
// Warmwassertank beladen.
if (isWaterHeatingTime && currentSwitchStatus == false) {
if (waterTankTemp <= startWaterTemp) {
print("is water heating time");
Shelly.call("Switch.Set", {
id: 0,
on: true
});
} else {
print("is water heating time, but water Tank Temp high enought");
}
} else if (isWaterHeatingTime && currentSwitchStatus == true && !isHeatingTime) {
if (waterTankTemp >= stopWaterTemp) {
print("water heating Tem. is over max Stop heating");
Shelly.call("Switch.Set", {
id: 0,
on: false
});
}
}
print("returnFlowTemp: " + returnFlowTemp);
//Prüfen ob eine Heizzeit eingetreten ist!
if (outdoorTemp < maxTemp && returnFlowTemp < returnFlowTempMin) {
if (isHeatingTime && currentSwitchStatus == false) {
print("is heating time");
Shelly.call("Switch.Set", {
id: 0,
on: true
});
} else if (!isHeatingTime && currentSwitchStatus == true && !isWaterHeatingTime) {
if () {
print("no heating time trun off");
Shelly.call("Switch.Set", {
id: 0,
on: false
});
}
}
} else {
print("is heating time, but Outdoor Temp or returnFlowTemp to high");
if (currentSwitchStatus == true && !isWaterHeatingTime) {
Shelly.call("Switch.Set", {
id: 0,
on: false
});
}
}
});
Alles anzeigen