Tatsächlich gerne. Dies hier ist allerdings schon speziell mit einem über die API gelieferten Raumtemperatur-Wert. Also keine undedingt üblichen Bordmittel. Nur mal so als Eindruck, was mir die KI auf meine Idee hin erstellt hat, hier die aktuelle Version des Scripts. Das ist schon stark ... // Raumaufschaltung fuer die Uebergangszeit // Das Script laeuft alle 10 Minuten. // Es nutzt die echte Aussentemperatur und die Raumtemperatur, // um unnoetiges Takten in der Uebergangszeit zu reduzieren. // Aktuelle Mess- und Einstellwerte lesen. let atRaw = outsideTemp(); let roomRaw = feature("heating.circuits.0.sensors.temperature.room"); let slopeRaw = featureProp("heating.circuits.0.heating.curve", "slope"); let levelRaw = featureProp("heating.circuits.0.heating.curve", "shift"); let roomTargetRaw = featureProp("heating.circuits.0.operating.programs.normalHeating", "temperature"); // Wenn ein wichtiger Wert fehlt, wird der Sicherheitszweig verwendet. let anyDefault = atRaw == nil or roomRaw == nil or slopeRaw == nil or levelRaw == nil or roomTargetRaw == nil; let at = atRaw ?? -99; let room = roomRaw ?? 20.7; let slope = slopeRaw ?? 0.9; let level = levelRaw ?? 999; let roomTarget = roomTargetRaw ?? -999; // Komfortziel merken. Standard: 21 Grad. // Ein manueller Raumsoll-Wert zwischen 20 und 23 Grad wird als neues Komfortziel uebernommen. let lastScriptTarget = get("lastScriptTarget", 21); let savedComfortTarget = get("comfortTarget", 21); let manualComfortChange = roomTarget >= 20 and roomTarget <= 23 and roomTarget != lastScriptTarget; let manualExitSavings = roomTarget >= 20 and roomTarget <= 23 and lastScriptTarget == 3; let comfortTarget0 = manualComfortChange ? roomTarget : savedComfortTarget; let comfortTarget = comfortTarget0 < 20 or comfortTarget0 > 23 ? 21 : comfortTarget0; // Hysterese der echten Aussentemperatur: // ab 9,5 Grad wird Niveau 11 gewaehlt, bis 8,5 Grad Niveau 7. // Zwischen 8,5 und 9,5 Grad bleibt der zuletzt gespeicherte Zustand erhalten. let rememberedLevel = get("weatherLevel", level == 11 ? 11 : 7); let switchToHigh = rememberedLevel == 7 and at >= 9.5; let switchToLow = rememberedLevel == 11 and at <= 8.5; let weatherLevel = switchToHigh ? 11 : switchToLow ? 7 : rememberedLevel; // Zustand bei jedem Lauf speichern, auch im Raumtemperatur-Totband. let rememberedWeatherLevel = set("weatherLevel", weatherLevel); if anyDefault { // Sicherheitsbetrieb bei fehlenden Daten: Komfortziel 21 Grad und Niveau 9. log("Rettungsanker wegen Default-Wert: vorher AT", at, "Raum-Ist", room, "Raum-Soll", roomTarget, "Komfortziel", comfortTarget, "Niveau", level, "| danach: Raum-Soll", 21, "Niveau", 9); let roomAction = roomTarget != 21 ? setRoomTemperature(0, "normal", 21) : false; let levelAction = level != 9 ? setHeatingCurve(0, slope, 9) : false; let comfortState = set("comfortTarget", 21); let stateAction = set("lastScriptTarget", 21); levelAction } else if manualExitSavings { // Manuelle Vitotrol-Aenderung beendet die Sparschaltung sofort. let levelWanted = at >= 9.5 ? 11 : at <= 8.5 ? 7 : weatherLevel; log("Manuelles Ende Sparmodus: vorher AT", at, "Raum-Soll", roomTarget, "Niveau", level, "| danach: Raum-Soll", comfortTarget, "Niveau", levelWanted); let roomAction = roomTarget != comfortTarget ? setRoomTemperature(0, "normal", comfortTarget) : false; let levelAction = level != levelWanted ? setHeatingCurve(0, slope, levelWanted) : false; let comfortState = set("comfortTarget", comfortTarget); let stateAction = set("lastScriptTarget", comfortTarget); levelAction } else if room <= comfortTarget - 0.3 { // Der Raum ist mindestens 0,3 Grad zu kalt: Heizen erzwingen. log("Rettungsanker Heizen: vorher AT", at, "Raum-Ist", room, "Raum-Soll", roomTarget, "Niveau", level, "| danach: Raum-Soll", comfortTarget, "Niveau", 9); let roomAction = roomTarget != comfortTarget ? setRoomTemperature(0, "normal", comfortTarget) : false; let levelAction = level != 9 ? setHeatingCurve(0, slope, 9) : false; let comfortState = set("comfortTarget", comfortTarget); let stateAction = set("lastScriptTarget", comfortTarget); levelAction } else if weatherLevel == 11.0 { // Wetterzustand Niveau 11: Uebergangsbetrieb. if room <= comfortTarget { log("Uebergang Heizen: vorher AT", at, "Raum-Ist", room, "Raum-Soll", roomTarget, "Niveau", level, "| danach: Raum-Soll", comfortTarget, "Niveau", 11); let roomAction = roomTarget != comfortTarget ? setRoomTemperature(0, "normal", comfortTarget) : false; let levelAction = level != 11 ? setHeatingCurve(0, slope, 11) : false; let comfortState = set("comfortTarget", comfortTarget); let stateAction = set("lastScriptTarget", comfortTarget); levelAction } else if room >= comfortTarget + 0.5 { // Raum ist mindestens 0,5 Grad zu warm: Sparschaltung gegen Takten. // Raum-Soll 3 Grad fordert keine Raumheizung an; es ist keine Ziel-Raumtemperatur. log("Uebergang Sparmodus: vorher AT", at, "Raum-Ist", room, "Raum-Soll", roomTarget, "Niveau", level, "| danach: Raum-Soll", 3, "Niveau", 11); let roomAction = roomTarget != 3 ? setRoomTemperature(0, "normal", 3) : false; let levelAction = level != 11 ? setHeatingCurve(0, slope, 11) : false; let stateAction = set("lastScriptTarget", 3); levelAction } else { log("Totband: AT", at, "Raum-Ist", room, "Raum-Soll", roomTarget, "Niveau", level, "| keine Aenderung"); false } } else { // Wetterzustand Niveau 7: witterungsgefuehrter Betrieb. log("Witterungsgefuehrt: vorher AT", at, "Raum-Ist", room, "Raum-Soll", roomTarget, "Niveau", level, "| danach: Raum-Soll", comfortTarget, "Niveau", 7); let roomAction = roomTarget != comfortTarget ? setRoomTemperature(0, "normal", comfortTarget) : false; let levelAction = level != 7 ? setHeatingCurve(0, slope, 7) : false; let comfortState = set("comfortTarget", comfortTarget); let stateAction = set("lastScriptTarget", comfortTarget); levelAction }
... Mehr anzeigen