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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Skalierbares Skript zur Steuerung einer Fussbodenheizung

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    993

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.3k

Skalierbares Skript zur Steuerung einer Fussbodenheizung

Geplant Angeheftet Gesperrt Verschoben JavaScript
1 Beiträge 1 Kommentatoren 173 Aufrufe 1 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.
  • jmeister79J Offline
    jmeister79J Offline
    jmeister79
    schrieb am zuletzt editiert von jmeister79
    #1

    Moin,
    ich bin gerade dabei mein Erdgeschuss um eine Fussbodenheizung zu erweitern. Ich habe darauf verzichtet, mir in jeden Raum einen Thermostat zu installieren und habe stattdessen meine vorhandenen Raumtemperatursensoren und einen Satz Shelly 1 Dazu verwendet, die Heizung zu steuern.
    Ich habe hier eine Umwälzpumpe die den Heizkreisverteiler mit mit Rücklaufwasser abgekühltem Vorlaufwasser versorgt.
    Diese Pumpe ist mit einer Oderverknüpfung an die Normally Closed Stellmotoren angeschlossen: Ist mindestens ein Stellantrieb auf, läuft die Pumpe, sollte keiner auf sein schaltet sie ab.

    Ich habe diese Geschichte zunächst für die Küche auf Basis eines Scripts, das ich von @Matt77CHE bekommen habe, zum Laufen gebracht.

    Ich habe dieses Script stark vereinfacht und Hysterese basiert aufgebaut.

    Zusammengefasst funktioniert es so:
    Alle 10 min wird die Raumtemperatur mit der Solltemperatur erfasst und wenn die Istwerte über Sollwert+Hysterese sind wird abgeschaltet. Fallen sie unter Istwert-Hysterese wird eingeschaltet.
    Das ganze habe ich gestern mal in eine For Schleife gepackt, so dass es übe Anpassung des Array am anfang auf Eure Situation angepasst werden kann.
    Ihr müsstet lediglich den Array entsprechend vergrößern/verkleinern und eure Sensoren und Aktoren sowie NO/NC eintragen.
    Alles andere wird angelegt. Alle nötigen Parameter liegen dann im Javascript Objektordner

    //Steuerparameter 
    createState("javascript.0.Heizung.VirtualSwitchFB", 0.0, {name: "Virtueller SChalter Fussbodenheizung", type: 'boolean'});
    createState("javascript.0.Heizung.FBPumpActive", 0.0, {name: "FB Pumpe aktiv", type: 'boolean'});
    createState("javascript.0.Heizung.refreshFloorHeatingCircuits", 0.0, {name: "Update FB", type: 'boolean'});
    createState("javascript.0.Heizung.FBWidget", 'leer', {type: 'string',name: 'FB Widget'});
    
    //Unterordner definieren
    const paramPath = "javascript.0.Heizung.Parameter.";//Pfad für Parameterordner
    const setpointPath = paramPath+"Zieltemperaturen."; //Pfad Vorgabetemperturen
    const hysteresisPath = paramPath+"Hysteresen.";  //Pfad Hysteresen
    const manualTempModePath = paramPath+"ManualTempMode.";  //Pfad manuelle Temperaturauswahl
    
    //Hauptarray anlegen [Nummer, Raum, Temperatursensor, Schaltaktor, Logik (NO: Stromlos offen, NC: Stromlos geschlossen)]
    var fb_array = [
    "##1","Küche","zigbee.0.00158d0002fbecb1.temperature","shelly.0.SHSW-1#349454738F09#1.Relay0.Switch","NC",
    "##2","Kinderzimmer","zigbee.0.00124b002918fc07.temperature","shelly.0.SHSW-1#34945474BB26#1.Relay0.Switch","NC",
    "##3","Wohnzimmer","zigbee.0.00158d000429ef25.temperature","shelly.0.SHSW-1#34945474C344#1.Relay0.Switch","NC",
    "##4","Bad","zigbee.0.00124b002918afdf.temperature","shelly.0.SHSW-1#349454738DC9#1.Relay0.Switch","NC"
    ];
    
    
    //Anlegen der Systemparameter und Variablen im Ordner 0.javascript.Heizung
    for (var i = 0; i < fb_array.length; i++) { // for every 5th array object
        if (fb_array[i].includes("##")){  //Neue Zeile
            createState(setpointPath+fb_array[i+1], false, {name: "Zieltemperatur "+fb_array[i+1], type: 'number', unit: '°C'});
            createState(hysteresisPath+fb_array[i+1], false, {name: "Hysterese "+fb_array[i+1], type: 'number', unit: '°C'});
            createState(manualTempModePath+fb_array[i+1], false, {name: "Manuelle Temperaturauswahl "+fb_array[i+1], type: 'boolean'});
        }
    } 
    //Alle 10 Minuten die Räume überprüfen  
    
    
     
    log('FB restarted')// Nur zur Info
    
    function refreshFloorHeatingCircuits(){    
        log('...')
        var PumpActive = false;  //Rücksetzen der Hilfsvariable
    
        //Array durchlaufen um die Räume zu steuern
        for (var i = 0; i < fb_array.length; i++) {
            if (fb_array[i].includes("##")){  //Neue Zeile gefunden
    
                //Fallunterscheidung ob Solltemperatur Parameter durch Heizungssystem oder eigene 
                if (getState(manualTempModePath+fb_array[i+1]).val == true) {
                    var targetTemp = parseInt(getState(setpointPath+fb_array[i+1]).val);
                }else{
                    var targetTemp = parseInt(getState("ems-esp.0.heatingCircuits.hc1.currentRoomSetpoint").val);
                };
    
                //Hysterese auslesen
                var hysteresis = parseInt(getState(hysteresisPath+fb_array[i+1]).val);
    
                // Wenn der Virtuelle schalter eingeschaltet ist 
                if (getState("javascript.0.Heizung.VirtualSwitchFB").val == true) {   
                    //Nur schalten wenn nötig im bereich wird nichts gemacht
                    if (getState(fb_array[i+2]).val >= targetTemp+hysteresis) {//Warm genug-> ausschalten
                        setState(fb_array[i+3], false, true);
                    } else if (getState(fb_array[i+2]).val < targetTemp-hysteresis) { // zu kalt -> einschalten
                        setState(fb_array[i+3], true, true);
                        PumpActive = true;
                    }
                } else {  // alles stoppen, alles aus  
                    log(fb_array[i+1]+' wird ausgeschaltet');
                    setState(fb_array[i+3], false, true);    
                }
    
            }
        }
        setState("javascript.0.Heizung.FBPumpActive", PumpActive, true);    //Wenn einer der Aktoren aktiv ist schaltet meine Pumpe in    
    }
    
    schedule("*/10 * * * *", function () {
        refreshFloorHeatingCircuits();
    });
    
    //Wenn der Hauptschalter verändert wurde dann einmal durchlaufen (ToDo: Triggerbedingung um Vorgabetemperaturen usw Parameter erweitern)
    on({id: 'javascript.0.Heizung.VirtualSwitchFB', change: 'any'}, async function (obj) {
        refreshFloorHeatingCircuits();
    });  
    on({id: 'javascript.0.Heizung.refreshFloorHeatingCircuits', change: 'gt'}, async function (obj) {
        setState("javascript.0.Heizung.refreshFloorHeatingCircuits",false);  //Rücksetzen der Triggervariable
        refreshFloorHeatingCircuits();
    });  
    
    
    

    Ergänzend erzeuge ich noch ein HTML Widget was das schön darstellt. (nicht in diesem Listing)

    Es ist noch sehr wichtig, dass Zustand und Erreichbarkeit aller beteiligten Sensoren/Aktoren noch separat überwacht werden. Ein Problem wird auf alles VIS dargestellt und ich bekomme einen Warnung via Telegram.

    Falls ich was ändere, poste ich updates-

    LG
    Nils
    Ich hoffe das Programm ist was für den ein oder anderen.
    Ich freue mich über Feedback, Verbesserungsvorschläge und alternative Ansteuerungen.

    [edit] jetzt als function anstatt doofer hilfsvariablen

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


    Support us

    ioBroker
    Community Adapters
    Donate

    317

    Online

    32.6k

    Benutzer

    82.3k

    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