Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

[Vorlage] Ventilsteuerung PWM-Ansatz für FBH/IR-Panele o.ä.

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
83 Beiträge 22 Kommentatoren 19.2k Aufrufe 9 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • apollon77A Offline
    apollon77A Offline
    apollon77
    schrieb am zuletzt editiert von apollon77
    #1

    Hi,

    ich habe vor kurzem die Ventilsteuerung meiner Fussbodenheizungssteuerung auf ioBroker umgestellt. Nachdem ich einige ANsätze, auch hier aus dem Forum nicht kapiert habe, bin ich im Homematic-Forum fündig geworden.

    Basierend auf dem Skript "Fußbodenheizung - Steuerung/IR-Heizung-Steuerung" von twoxx aus dem Homematic-Forum (https://homematic-forum.de/forum/viewto … 31&t=24890) habe ich das nach ioBroker JavaScript portiert und etwas verschlankt.

    Das interessante an dem Skriptansatz ist, dass es die Raumtemperatur "überwacht" und versucht die Ventile früh genug auszuschalten das die Temperatur nicht übersteuert, aber auch früh genug wieder einzuschalten. Das ganze folgt einem PWM-Ansatz im Default auf das 20 Minuten Skriptintervall und schaltet daher auch teilweise nur für ein paar Minuten ein.

    Details zur Funktionsweise und der wichtigen Konfigurationsparameter am besten im Original-Thread im Homematic-Forum informieren. Die Parameternamen sind weiterstgehend die gleichen. Ich habe nur ein paar Dinge (Sicherheitsheizen bei bestimmten Außentemperaturen) weggenommen und einige Dinge so umgebaut das die Entwicklung der letzten 3 Skriptläufe (=60Min) "rollierend" betrachtet werden können.

    In den Räumen an sich habe ich überall Homematic-Wandthermostate angebracht und die Ventile werden über Homematic-Schaltaktoren gesteuert. Die Skripte sind aber grundsätzlich so flexibel das problemlos auch andere Hersteller eingesetzt werden können. Keins davon steuert irgendwas an den Ventilen direkt, das macht alles dieses Skript!

    Das Skript hier ist aber unabhängig von der Art wie die Thermostate und Programme ablaufen, es nimmt die Ist- und Solltemperarturen und steuert dann die Ventil-Aktoren.

    Die Konfiguration besteht aus drei Teilen:

    1.) Die Raum-Objekte am Anfang haben einen Eintrag pro Raum mit State-ID Definitionen. Die Namen der Räume können frei gewählt werden und sind primär für das Logging interessant. Die State-IDs wie bei "OG-Bad" zu sehen sind Pflicht. Bei EG-Wohnzimmer habe ich noch einen zweiten Heizkreis den ich nur zum hochheizen als "Unterstützung" nutze, der bleibt zum halten der Temperatur aber aus. Darüber könnte man auch ein IR-Panel oder einen Heizlüfter mit nutzen.

    2.) Die 4 Werte danach definieren die Rahmenbedingungen für die Steuerung. Details siehe Homematic Forum, da ist auch eine Grafik :-)

    Weiterhin kann man ausführliches Logging aktivieren.

    3.) In der Funktion "initialize" werden noch einige Grundwerte eingetragen, die eher statisch sind.

    In "Schaltschwelleniedertemp" und "Schaltschwellehochtemp" stehen an sich die Laufzeiten der Ventile (Auf-Zu) drin. Sind bei mir etwas mehr als 3 Minuten, sollte jeder selbst ermitteln.

    In "heizunterstuetzungKelvin" ist drin ab wieviel Kelvin (=Grad) Temperaturunterschied ein pot. angegebener Unterstützungsaktor genutzt wird

    Man kann all diese Object-Keys, wenn man Sie pro Raum anders braucht, auch direkt im rooms-Objekt beim Raum setzen, dann wird das genutzt.

    Hier das Skript (20180101)

    // Thread im ioBroker-Forum: http://forum.iobroker.net/viewtopic.php?f=21&t=10111
    
    var rooms= {
        'DG-Luca': {
            stateIdHeizungAktor: "hm-rpc.0.LEQ0282183.3.STATE",
            stateIdHeizungAktorOnTime: "hm-rpc.0.LEQ0282183.3.ON_TIME",
            stateIdSollTemperatur: "hm-rpc.0.NEQ0072178.2.SET_TEMPERATURE",
            stateIdIstTemperatur: "hm-rpc.0.NEQ0072178.1.TEMPERATURE"
        },
        'DG-Jana': {
            stateIdHeizungAktor: "hm-rpc.0.LEQ0282183.2.STATE",
            stateIdHeizungAktorOnTime: "hm-rpc.0.LEQ0282183.2.ON_TIME",
            stateIdSollTemperatur: "hm-rpc.0.NEQ0072437.2.SET_TEMPERATURE",
            stateIdIstTemperatur: "hm-rpc.0.NEQ0072437.1.TEMPERATURE"
        },
        'DG-Duschbad': {
            stateIdHeizungAktor: "hm-rpc.0.LEQ0282183.1.STATE",
            stateIdHeizungAktorOnTime: "hm-rpc.0.LEQ0282183.1.ON_TIME",
            stateIdSollTemperatur: "hm-rpc.0.NEQ0071913.2.SET_TEMPERATURE",
            stateIdIstTemperatur: "hm-rpc.0.NEQ0071913.1.TEMPERATURE"
        },
        'OG-Bad': {
            stateIdHeizungAktor: "hm-rpc.0.NEQ1503796.1.STATE",
            stateIdHeizungAktorOnTime: "hm-rpc.0.NEQ1503796.1.ON_TIME",
            stateIdSollTemperatur: "hm-rpc.0.NEQ0124378.2.SET_TEMPERATURE",
            stateIdIstTemperatur: "hm-rpc.0.NEQ0071913.1.TEMPERATURE"
        },
        'EG-Wohnzimmer': {
            stateIdHeizungAktor: "hm-rpc.0.OEQ0653582.1.STATE",
            stateIdHeizungAktorOnTime: "hm-rpc.0.OEQ0653582.1.ON_TIME",
            stateIdHeizungUnterstuetzungAktor: "hm-rpc.0.MEQ0361527.1.STATE",
            stateIdHeizungUnterstuetzungAktorOnTime: "hm-rpc.0.MEQ0361527.1.ON_TIME",
            stateIdSollTemperatur: "hm-rpc.0.OEQ0987006.2.SET_TEMPERATURE",
            stateIdIstTemperatur: "hm-rpc.0.JEQ0122620.1.TEMPERATURE"
        }
    };
    var hochtempAufschlag = 0.5; // hochtemp = solltemperatur + hochtempAufschlag
    var niedertempAbschlag = 1; // niedertemp = solltemperatur - niedertempAbschlag
    var hochstillAufschlag = 0.1; // hochstill = solltemperatur + hochstillAufschlag
    var niederstillAbschlag = 0.2; // niederstill = solltemperatur - niederstillAbschlag
    
    var debug = true;
    
    initialize();
    
    function initialize() {
        for (var room in rooms) {
            if (!rooms[room].Sicherheitsheizzeit) rooms[room].Sicherheitsheizzeit = 240; // Heizzeit, falls errechnete Heizzeit im Minus
            if (!rooms[room].Schaltschwelleniedertemp) rooms[room].Schaltschwelleniedertemp = 190; // Sofern errechnete Schaltzeit kleiner, dann nicht einschalten
            if (!rooms[room].Schaltschwellehochtemp) rooms[room].Schaltschwellehochtemp = 190; // Sofern errechnete Schaltzeit kleiner, dann nicht einschalten
            if (!rooms[room].skriptZyklus) rooms[room].skriptZyklus = 20;
            if (!rooms[room].heizunterstuetzungKelvin) rooms[room].heizunterstuetzungKelvin = 1;  // Wenn Temperaturunterschied größer als diese ANzahl Kelvon dann wird Unterstützung verwendet
    
            if (!rooms[room].FBStartTemperatur) rooms[room].FBStartTemperatur = [];
            if (!rooms[room].StartHeizzeit) rooms[room].StartHeizzeit = [new Date().getTime()-1000*60];
            if (!rooms[room].FBVergleichTemp) rooms[room].FBVergleichTemp = 0;
    
            if (rooms[room].hochtempAufschlag === undefined) rooms[room].hochtempAufschlag = hochtempAufschlag;
            if (rooms[room].niedertempAbschlag === undefined) rooms[room].niedertempAbschlag = niedertempAbschlag;
            if (rooms[room].hochstillAufschlag === undefined) rooms[room].hochstillAufschlag = hochstillAufschlag;
            if (rooms[room].niederstillAbschlag === undefined) rooms[room].niederstillAbschlag = niederstillAbschlag;
    
            rooms[room].letztesEIN = 0;
            rooms[room].skriptTimeout = null;
    
            if (getState(rooms[room].stateIdHeizungAktor).val) {
                if (debug) {console.log('    ' + room + ': Aktor eingeschaltet');}
                rooms[room].letztesEIN = new Date().getTime();
            }
    
            initializeSubscribes(room);
    
            if (debug) {console.log('Ventillogik für Raum ' + room + ' initialisiert');}
            ventilLogik(room);
        }
    }
    
    function initializeSubscribes(room) {
        on({id: rooms[room].stateIdHeizungAktor, change: 'any'}, function(state) {
            if (debug) {console.log('Änderung Status Aktor FBH ' + room + ': ' + state.oldState.val + '--> ' + state.state.val + ' (ack=' + state.state.ack + ', from=' + state.state.from + ')');}
            if (state.state.ack && state.state.val) {
                rooms[room].letztesEIN = new Date().getTime();
            }
        });
    
        on({id: rooms[room].stateIdSollTemperatur, change: 'ne'}, function(state) {
            if (debug) {console.log('Änderung Solltemperatur ' + room + ': --> ' + state.state.val + ' (ack=' + state.state.ack + ', from=' + state.state.from + ')');}
            ventilLogik(room);
        });
    }
    
    onStop(function (callback) {
        for (var room in rooms) {
            if (getState(rooms[room].stateIdHeizungAktor).val) {
                controlFBHAktor(room, false); // Alle ausschalten wenn Skript aus geht
                if (rooms[room].skriptTimeout) {
                    clearTimeout(rooms[room].skriptTimeout);
                    rooms[room].skriptTimeout = null;
                }
            }
        }
        setTimeout(callback, 1000);
    }, 3000);
    
    function ventilLogik(roomName) {
        if (rooms[roomName].skriptTimeout) {
            clearTimeout(rooms[roomName].skriptTimeout);
            rooms[roomName].skriptTimeout = null;
        }
        // Temperaturen feststellen
        var isttemperatur = getState(rooms[roomName].stateIdIstTemperatur).val;
        var solltemperatur = getState(rooms[roomName].stateIdSollTemperatur).val;
        var schaltzustand = getState(rooms[roomName].stateIdHeizungAktor).val;
        var aktivSeit = 0;
        if (schaltzustand && rooms[roomName].letztesEIN) aktivSeit = (new Date().getTime() - rooms[roomName].letztesEIN) / 1000 / 60;
        if (debug) {console.log('Start Ventillogik ' + roomName + ': IstTemp=' + isttemperatur + ', VergleichTemp=' + rooms[roomName].FBVergleichTemp + ', SollTemp=' + solltemperatur + ', Aktor=' + schaltzustand + ' (seit ' + aktivSeit + 'm)');}
    
        // GrenzTemperaturen berechnen
        var hochtemp = solltemperatur + rooms[roomName].hochtempAufschlag;
        var niedertemp = solltemperatur - rooms[roomName].niedertempAbschlag;
        var hochstill = solltemperatur + rooms[roomName].hochstillAufschlag;
        var niederstill = solltemperatur - rooms[roomName].niederstillAbschlag;
        var toleranz = hochtemp - niedertemp;
    
        // rooms[roomName].StartHeizzeit in Systemvariable schreiben
        rooms[roomName].FBStartTemperatur.push(isttemperatur);
        if (rooms[roomName].FBStartTemperatur.length > 3) rooms[roomName].FBStartTemperatur.shift();
        if (debug) {console.log("    Start FBStartTemp=" + rooms[roomName].FBStartTemperatur[0]);}
    
        // Differenz Starttemperatur und Endtemperatur ausrechnen
        var FBTempDiff = isttemperatur - rooms[roomName].FBStartTemperatur[0];
        if (FBTempDiff <= 0) {
            if (debug) {console.log("    TempDiff <= 0: " + FBTempDiff + " --> 0.01");}
            FBTempDiff = 0.01;
        }
        else {
            if (debug) {console.log("    TempfDiff > 0: " + FBTempDiff);}
        }
    
        // Endheizzeit in Systemvariable, Isttemperatur in Systemvariable schreiben, Differenz heizzeit u Temp errechnen
        var EndHeizzeit = new Date().getTime();
    
        // Heizzeit Differenz für Tempvorausrechnung errechnen
        var DiffStartEndHeizzeit = (EndHeizzeit - rooms[roomName].StartHeizzeit[0]) / 1000 / 60;
    
        // Heizzeit Differenz für automatische Errechnung Scriptintervall errechnen
        var Scriptintervall = rooms[roomName].skriptZyklus;
    
        // Steuerung Fussbodenheizung
        var heizleistung;
        var heizzeit;
        var heizzeit1;
        var einschaltzeitvergleichtemp;
        var tempdifferenzkalkreal;
        var reduzierungszeit;
        var neueheizzeit;
        // Einschaltzeit berechnen -----------------
        if (isttemperatur <= solltemperatur) {
            if (debug) {console.log("    Isttemperatur <= Solltemperatur");}
            heizleistung = ((solltemperatur + 0.2 - isttemperatur) / toleranz) * 100;
            heizzeit1 = (Scriptintervall * heizleistung) / 100;
            einschaltzeitvergleichtemp = (FBTempDiff * heizzeit1) / DiffStartEndHeizzeit;
            if (((toleranz * heizleistung) / 100) >= einschaltzeitvergleichtemp) {
                if (debug) {console.log("        heizzeit im original übernommen (heizleistung=" + heizleistung + ", Scriptintervall=" + Scriptintervall + ")");}
                heizzeit = heizzeit1 * 60;
            }
            else {
                if (debug) {console.log("        reduzierte heizzeit übernommen");}
                tempdifferenzkalkreal = einschaltzeitvergleichtemp - ((toleranz * heizleistung) / 100);
                reduzierungszeit = (tempdifferenzkalkreal * Scriptintervall) / FBTempDiff;
                neueheizzeit = heizzeit1 - reduzierungszeit;
                if (neueheizzeit <= 0) {
                    heizzeit = rooms[roomName].Sicherheitsheizzeit;
                    if (debug) {console.log("        sicherheitshalber 4 Minuten heizen");}
                }
                else {
                    heizzeit = neueheizzeit * 60;
                    if (debug) {console.log("        neueheizzeit übernommen");}
                }
            }
        }
        else {
            if (debug) {console.log("    Isttemperatur > solltemperatur");}
            heizleistung = ((hochtemp - isttemperatur) / toleranz) * 100;
            heizzeit1 = (Scriptintervall * heizleistung) / 100;
            einschaltzeitvergleichtemp = FBTempDiff * heizzeit1 / DiffStartEndHeizzeit;
            if (((toleranz * heizleistung) / 100) >= einschaltzeitvergleichtemp) {
                if (debug) {console.log("        heizzeit im original übernommen (heizleistung=" + heizleistung + ", Scriptintervall=" + Scriptintervall + ")");}
                heizzeit = heizzeit1 * 60;
            }
            else {
                if (debug) {console.log("        reduzierte heizzeit übernommen");}
                tempdifferenzkalkreal = einschaltzeitvergleichtemp - ((toleranz * heizleistung) / 100);
                reduzierungszeit = (tempdifferenzkalkreal * Scriptintervall) / FBTempDiff;
                neueheizzeit = heizzeit1 - reduzierungszeit;
                if (neueheizzeit <= 0) {
                    heizzeit = rooms[roomName].Sicherheitsheizzeit;
                    if (debug) {console.log("        sicherheitshalber 4 Minuten heizen??");}
                }
                else {
                    heizzeit = neueheizzeit * 60;
                    if (debug) {console.log("        neueheizzeit übernommen");}
                }
            }
        }
    
        // Künftige Temperatur bei doppelter Schaltzeit vorausrechnen
        var tempvorausrechnung = FBTempDiff * (Scriptintervall * 2) / DiffStartEndHeizzeit;
        var Neueisttemperatur = isttemperatur + tempvorausrechnung;
    
        if (debug) {console.log('    Errechnete Heizzeit=' + heizzeit + ' --> Neue-Ist-Temp=' + Neueisttemperatur + ' (+' + tempvorausrechnung + ')');}
    
        // Schaltungen ausführen
        if ((isttemperatur < hochtemp) && (isttemperatur > niedertemp)) {
            if ((rooms[roomName].FBVergleichTemp === isttemperatur) && (isttemperatur > solltemperatur)) {
                if (debug) {console.log("    Ist = Vergleichstemperatur");}
                if (schaltzustand) {
                    if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                    controlFBHAktor(roomName, false);
                }
                else {
                    if (debug) {console.log("        ist ausgeschaltet und soll ausgeschaltet sein");}
                }
            }
            else {
                if (debug) {console.log("    innerhalb toleranz");}
                if ((isttemperatur <= hochstill) && (isttemperatur >= niederstill)) {
                    if (debug) {console.log("    innerhalb stille");}
                    if (schaltzustand) {
                        if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                        controlFBHAktor(roomName, false);
                    }
                    else {
                        if (debug) {console.log("        ist ausgeschaltet und soll ausgeschaltet sein");}
                    }
                }
                else {
                    if (debug) {console.log("    ausserhalb stille");}
                    if (isttemperatur < niederstill) {
                        if (heizzeit < rooms[roomName].Schaltschwelleniedertemp) {
                            if (debug) {console.log("    Schaltzeit zu klein");}
                            if (schaltzustand) {
                                if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                                controlFBHAktor(roomName, false);
                            }
                            else {
                                if (debug) {console.log("        ist ausgeschaltet und soll ausgeschaltet sein");}
                            }
                        }
                        else {
                            if (debug) {console.log("    kleiner niederstill");}
                            controlFBHAktor(roomName, true, heizzeit);
                        }
                    }
                    else {
                        if (rooms[roomName].FBVergleichTemp < isttemperatur) {
                            if (debug) {console.log("    über hochstill gestiegen");}
                            if (schaltzustand) {
                                if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                                controlFBHAktor(roomName, false);
                            }
                            else {
                                if (debug) {console.log("        ist ausgeschaltet und soll ausgeschaltet sein");}
                            }
                        }
                        else {
                            if (heizzeit < rooms[roomName].Schaltschwellehochtemp) {
                                if (debug) {console.log("    Schaltzeit zu klein");}
                                if (schaltzustand) {
                                    if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                                    controlFBHAktor(roomName, false);
                                }
                                else {
                                    if (debug) {console.log("        ist ausgeschaltet und soll ausgeschaltet sein");}
                                }
                            }
                            else {
                                if (debug) {console.log("    größer als hochstill");}
                                controlFBHAktor(roomName, true, heizzeit);
                            }
                        }
                    }
                }
            }
        }
        else {
            if (isttemperatur >= hochtemp) {
                if (debug) {console.log("    Isttemperatur größer als hochtemp");}
                if (schaltzustand) {
                    if (Neueisttemperatur <= solltemperatur) {
                        if (debug) {console.log("        Neue Isttemp kleiner gleich Solltemperatur");}
                        if (debug) {console.log("        ist eingeschaltet und soll eingeschaltet sein");}
                    }
                    else {
                        if (debug) {console.log("        Neue Isttemp grösser Solltemperatur");}
                        if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                        controlFBHAktor(roomName, false);
                    }
                }
                else {
                    if (Neueisttemperatur <= solltemperatur) {
                        if (debug) {console.log("        Neue Isttemp kleiner gleich Solltemperatur");}
                        if (debug) {console.log("        ist ausgeschaltet und soll eingeschaltet sein");}
                        controlFBHAktor(roomName, true, 36000);
                    }
                    else {
                        if (debug) {console.log("        Neue Isttemp grösser Solltemperatur");}
                        if (debug) {console.log("        ist ausgeschaltet und soll ausgeschaltet sein");}
                    }
                }
            }
            else {
                if (isttemperatur == niedertemp) {
                    if (schaltzustand) {
                        if (Neueisttemperatur >= niederstill) {
                            if (debug) {console.log("        Neue Isttemp größer gleich Niederstill");}
                            if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                            controlFBHAktor(roomName, false);
                        }
                        else {
                            if (debug) {console.log("        Neue Isttemp kleiner Niederstill");}
                            if (debug) {console.log("        ist eingeschaltet und soll eingeschaltet sein");}
                        }
                    }
                    else {
                        if (Neueisttemperatur >= niederstill) {
                            if (debug) {console.log("        Neue Isttemp größer gleich Niederstill");}
                            if (debug) {console.log("        ist ausgeschaltet und soll eingeschaltet sein");}
                        }
                        else {
                            if (debug) {console.log("        Neue Isttemp kleiner Niederstill");}
                            if (debug) {console.log("        ist ausgeschaltet und soll eingeschaltet sein");}
                            controlFBHAktor(roomName, true, 36000);
                        }
                    }
                }
                else {
                    if (debug) {console.log("    Isttemperatur ist kleiner als niedertemp");}
                    if (schaltzustand) {
                        if (Neueisttemperatur >= niederstill) {
                            if (debug) {console.log("        Neue Isttemp größer gleich Niederstill");}
                            if (debug) {console.log("        ist eingeschaltet und soll ausgeschaltet sein");}
                            controlFBHAktor(roomName, false);
                        }
                        else {
                            if (debug) {console.log("        Neue Isttemp kleiner Niederstill");}
                            if (debug) {console.log("        ist eingeschaltet und soll eingeschaltet sein");}
                        }
                    }
                    else {
                        if (Neueisttemperatur >= niederstill) {
                            if (debug) {console.log("        Neue Isttemp größer gleich Niederstill");}
                            if (debug) {console.log("        ist ausgeschaltet und soll eingeschaltet sein");}
                        }
                        else {
                            if (debug) {console.log("        Neue Isttemp kleiner Niederstill");}
                            if (debug) {console.log("        ist ausgeschaltet und soll eingeschaltet sein");}
                            controlFBHAktor(roomName, true, 36000);
                        }
                    }
                }
            }
        }
        rooms[roomName].FBVergleichTemp = isttemperatur;
    
        rooms[roomName].StartHeizzeit.push(new Date().getTime());
        if (rooms[roomName].StartHeizzeit.length > 3) rooms[roomName].StartHeizzeit.shift();
    
        rooms[roomName].skriptTimeout = setTimeout(function() {
            //if (debug) {console.log('Timeout ausgelöst ' + roomName);}
            rooms[roomName].skriptTimeout = null;
            ventilLogik(roomName);
        }, rooms[roomName].skriptZyklus*60*1000);
        if (debug) {console.log("Ende " + roomName + ', Nächster Lauf in ' + (rooms[roomName].skriptZyklus) + 'm');}
    }
    
    function controlFBHAktor(roomName, enabled, time) {
        var useSupport = false;
        if (rooms[roomName].stateIdHeizungUnterstuetzungAktor) {
            var isttemperatur = getState(rooms[roomName].stateIdIstTemperatur).val;
            var solltemperatur = getState(rooms[roomName].stateIdSollTemperatur).val;
            if (enabled && solltemperatur - isttemperatur > rooms[roomName].heizunterstuetzungKelvin) {
                if (debug) {console.log('    Steuern UnterstützungsAktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ')');}
                useSupport = true;
            }
            else if (!enabled || getState(rooms[roomName].stateIdHeizungUnterstuetzungAktor).val) useSupport = true;
        }
    
        if (enabled && time) {
            time = Math.round(time);
            setState(rooms[roomName].stateIdHeizungAktorOnTime, time, false, function() {
                if (debug) {console.log('    Steuern Aktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ')');}
                setState(rooms[roomName].stateIdHeizungAktor, true, false);
                if (useSupport) {
                    setState(rooms[roomName].stateIdHeizungUnterstuetzungAktorOnTime, time, false, function() {
                        if (debug) {console.log('    Steuern UnterstützungsAktor FBH ' + roomName + ' --> ' + enabled + ' (time=' + time + ', tempDiff=' + (solltemperatur - isttemperatur) + ')');}
                        setState(rooms[roomName].stateIdHeizungUnterstuetzungAktor, true, false);
                    });
                }
            });
        }
        else {
            if (debug) {console.log('    Steuern Aktor FBH ' + roomName + '--> ' + enabled);}
            setState(rooms[roomName].stateIdHeizungAktor, enabled, false);
            if (useSupport) {
                if (debug) {console.log('    Steuern UnterstützungsAktor FBH ' + roomName + '--> ' + enabled);}
                setState(rooms[roomName].stateIdHeizungUnterstuetzungAktor, enabled, false);
            }
        }
    }
    
    

    Viel Spass bei der Nutzung. Klappt bei mir recht gut und die Räume übersteuern fast nicht …

    Eine weitere Funktionalität zur Voraussteuerung und Aufheizzeitmessung gibt es unter http://forum.iobroker.net/viewtopic.php ... 89#p107689

    Ingo

    Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

    • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
    • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
    U 1 Antwort Letzte Antwort
    0
    • apollon77A Offline
      apollon77A Offline
      apollon77
      schrieb am zuletzt editiert von
      #2

      Versions-Historie:

      20171228:

      • initiale Version

      20180101:

      • Fix weil teilweise Timouts doppelt entstehen konnten. Sollte jetzt nicht mehr vorkommen.

      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
      1 Antwort Letzte Antwort
      0
      • S Offline
        S Offline
        simpixo
        schrieb am zuletzt editiert von
        #3

        Super auf das habe ich gewartet [emoji1303] Danke Danke Danke [emoji120]

        Gruß

        Adrian

        Gesendet von iPhone mit Tapatalk Pro

        1 Antwort Letzte Antwort
        0
        • apollon77A Offline
          apollon77A Offline
          apollon77
          schrieb am zuletzt editiert von
          #4

          Dann schau Dir das vllt noch an: Eine weitere Funktionalität zur Voraussteuerung und Aufheizzeitmessung gibt es unter http://forum.iobroker.net/viewtopic.php … 89#p107689

          Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

          • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
          • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
          1 Antwort Letzte Antwort
          0
          • K Offline
            K Offline
            Kueppert
            schrieb am zuletzt editiert von
            #5

            Sehr geil, wenn ich jetzt nicht zur Miete wohnen würde, würde ich endlich auch die FBH auf homematic umstellen… :-/

            Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk

            UDM Pro, Intel NUC - ioBroker in Proxmox-VM, PiHole+Grafana&Influx+TasmoAdmin in LXCs, Raspberry Pi3 (als CCU), Zigbee-Stick Sonoff, Synology DS918+

            1 Antwort Letzte Antwort
            0
            • apollon77A Offline
              apollon77A Offline
              apollon77
              schrieb am zuletzt editiert von
              #6

              Naja, so schwierig ist das nicht. Meistens ist es so das die FBH-Wandthermostate (z.B. von Jung oder so) auch gleichzeitig den "Schaltaktor = Relais" drin haben. Damit: Die FBH-Wandthermostate ausbauen einen HM-Schaltaktor in die UP-Dose und oben drüber ein HM-Thermostat. Lässt sich Problemlos später zurückbauen. Also mal schauen. Wenn da 230V ankommen und durchgeschaltet werden dann go. Aber selbst wenn es keine 230V sind (was eher ungewöhnlich wäre) sondern ggf was potentialfreies ist das auch mit HM Mitteln machbar denke ich.

              Das einzige was dabei blöd ist (weil bei mir passiert), dass du einen weiteren Raum-Temperatursensor brauchst, weil der HM-Aktor direkt "unter" dem HM-Thermostat wenn er aktiv ist durchaus wärme abstrahlt und damit die gemessene Temperatur am Thermostat verfälscht …

              Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

              • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
              • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
              1 Antwort Letzte Antwort
              0
              • apollon77A Offline
                apollon77A Offline
                apollon77
                schrieb am zuletzt editiert von
                #7

                Skript in Beitrag #1 aktualisiert, siehe auch Changelog im zweiten Beitrag:

                Fix weil teilweise Timouts doppelt entstehen konnten. Sollte jetzt nicht mehr vorkommen.

                Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                1 Antwort Letzte Antwort
                0
                • R Offline
                  R Offline
                  RobS
                  schrieb am zuletzt editiert von
                  #8

                  Hi Apollon,

                  erstmal vielen Dank für deine großartige Arbeit. Ich hatte schon länger vor unsere FBH smart zu machen und konnte mich dank deines Skriptes und deiner Erklärungen jetzt endlich daran wagen.

                  Seit gestern Abend läuft das Skript und die Ventile sind immerhin schon aufgegangen und es wurde geheizt.

                  Wo ich nicht ganz hinter gekommen bin ist, wo du den Datenpunkt XXX.ON_TIME herbekommst. Unter Objekten ist er bei mir nicht zu finden. Ich hatte versucht einfach mit Copy/Paste .STATE durch .ON_TIME zu ersetzen, was aber zu einer Warnung führt: state "XXX.ON_TIME" not found.

                  Ich benutze zur Steuerung der Ventile 12/7er HM-Wired-Aktoren.

                  Wäre nett, wenn du mir ein bißchen auf die Sprünge helfen könntest.

                  Grüße, Rob

                  1 Antwort Letzte Antwort
                  0
                  • apollon77A Offline
                    apollon77A Offline
                    apollon77
                    schrieb am zuletzt editiert von
                    #9

                    Welche Datenpunkte hat denn so ein 12/7er Channel bei eurer. Schick mal Screenshot

                    Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                    • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                    • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                    1 Antwort Letzte Antwort
                    0
                    • paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von
                      #10

                      HM-Wired-Aktoren haben keinen ON_TIME-Datenpunkt.

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      1 Antwort Letzte Antwort
                      0
                      • apollon77A Offline
                        apollon77A Offline
                        apollon77
                        schrieb am zuletzt editiert von
                        #11

                        Aber haben angeblich „timerfunktion“ ?! Ich baue heute Abend mal was ein

                        Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                        • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                        • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                        1 Antwort Letzte Antwort
                        0
                        • R Offline
                          R Offline
                          RobS
                          schrieb am zuletzt editiert von
                          #12

                          857_fbh.png

                          das sind die vier Datenpunkte pro Ausgang

                          1 Antwort Letzte Antwort
                          0
                          • 0 Offline
                            0 Offline
                            0018
                            schrieb am zuletzt editiert von
                            #13

                            Super Skript Danke!

                            Wie Verhält es sich wenn eine Störgröße (Kaminofen) die Regelung beeinfliusst?

                            Macht da die ganze Reglung überhaupt Sinn?

                            Mfg
                            0018

                            1 Antwort Letzte Antwort
                            0
                            • apollon77A Offline
                              apollon77A Offline
                              apollon77
                              schrieb am zuletzt editiert von
                              #14

                              Das sollte Problemlos gehen. Dazu ggf auch mal in dem Homematic-Forum Thread lesen.

                              Das Skript schaut sich aktuell alle 20 Minuten die Temperaturentwicklung an und entscheidet dann was zu tun ist. Wenn also der kaminofen in der zeit gut geheizt hat dann wird das Skript im Zweifel sagen "uuii das ging ja fix, ich rehne mal hoch wie die Temperatur bei der Entwicklung in 20 Minuten ist … oohh zu warm dann höre ich mal auf zu heizen" oder so :-)

                              Das ist diese Idee von dem Skript das es 20-60 Minuten der Vergangenheit nutzt um hochzurechnen was wie passiert in der Zukunft und daraus abzuleiten was jetzt getan werden muss.

                              Versuch es mal.

                              Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                              • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                              • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                              1 Antwort Letzte Antwort
                              0
                              • 0 Offline
                                0 Offline
                                0018
                                schrieb am zuletzt editiert von
                                #15

                                ich werde es mal testen und berichten :D

                                EDIT: Aktuell habe ich ja die Ventile mit meinen HM Wandthermostaten direkt über die CCU2 verknüpft um die Ventile zu steuern. Muss ich diese Verknüpfung jetzt löschen oder kann dieses als "Notlauf" aktiv bleiben?

                                Mfg
                                0018

                                1 Antwort Letzte Antwort
                                0
                                • R Offline
                                  R Offline
                                  RobS
                                  schrieb am zuletzt editiert von
                                  #16

                                  Moin Apollon,

                                  hast du rausfinden können, ob mit ner Timerfunktion der Wired-Aktoren was machbar ist oder sonst vielleicht eine Idee, wie ich das ohne „.on_time“ regeln könnte?

                                  Habe die FBH-Steierung jetzt fast ne Woche im Betrieb und muss sagen, dass es trotz des fehlenden Datenpunktes ziemlich gut funktioniert.

                                  Danke und Grüße, Rob

                                  1 Antwort Letzte Antwort
                                  0
                                  • apollon77A Offline
                                    apollon77A Offline
                                    apollon77
                                    schrieb am zuletzt editiert von
                                    #17

                                    @0018:

                                    ich werde es mal testen und berichten :D

                                    EDIT: Aktuell habe ich ja die Ventile mit meinen HM Wandthermostaten direkt über die CCU2 verknüpft um die Ventile zu steuern. Muss ich diese Verknüpfung jetzt löschen oder kann dieses als "Notlauf" aktiv bleiben? `

                                    Musst Du testen. Meine Erkenntnisse waren das die Wandthermostate sicherstellen das es so ist wie Sie es wollen. Also wenn Sie denken es soll aus sein und Du schaltest gesondert (direkt oder per Skript) ein dann haben die kurz drauf ausgeschaltet … Also bei mir hat es parallel nicht geklappt. kannST du ja aber mal manuell testen

                                    Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                                    • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                                    • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                                    1 Antwort Letzte Antwort
                                    0
                                    • apollon77A Offline
                                      apollon77A Offline
                                      apollon77
                                      schrieb am zuletzt editiert von
                                      #18

                                      @RobS:

                                      Moin Apollon,

                                      hast du rausfinden können, ob mit ner Timerfunktion der Wired-Aktoren was machbar ist oder sonst vielleicht eine Idee, wie ich das ohne „.on_time“ regeln könnte?

                                      Habe die FBH-Steierung jetzt fast ne Woche im Betrieb und muss sagen, dass es trotz des fehlenden Datenpunktes ziemlich gut funktioniert. `

                                      Sobald ich mal Zeit und Ruhe finde will ich das umbauen das es auch ohne on_time geht. Bissl geduld bitte :-)

                                      Am Ende heizt er jetzt ggf zuviel weil er immer nur 20 Minuten-Zeitscheiben heizen kann. Also ggf wirst du es ein bissl "zu warm" haben

                                      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                                      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                                      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                                      1 Antwort Letzte Antwort
                                      0
                                      • R Offline
                                        R Offline
                                        RobS
                                        schrieb am zuletzt editiert von
                                        #19

                                        @apollon77:

                                        [

                                        Bissl geduld bitte :-) `

                                        Sorry, ich wollte auf keinen Fall hetzen. Ich weiß sehr zu schätzen was du / ihr hier so in der Freizeit leistet!

                                        Ich werde den Thread im Auge behalten :geek:

                                        1 Antwort Letzte Antwort
                                        0
                                        • D Offline
                                          D Offline
                                          DJWatson
                                          schrieb am zuletzt editiert von
                                          #20

                                          Das ist echt eine super Sache die du da auf die Beine stellst großes Lob dafür. Macht es nicht Sinn die Rücklauftemperatur der einzelnen Heizkreise mit rein zu nehmen ? Dann hat man es genauer und vor allem schneller ehe der Raum überhitzt und man würde ein wenig Trägheit aus der FBH raus nehmen. Die Fliesen geben die Wärme ja über eine längere Zeit an den Raum ab egal ob die Heizung dann aus ist -> Der Raum überhitzt. Man würde damit die Spitzen raus nehmen. Es gab mal ein Kickstarterprojekt hieß glaube ich "Controme" die machen das ähnlich aber lassen sich das auch teuer bezahlen.

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          657

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe