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. Praktische Anwendungen (Showcase)
  4. WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    473

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.6k

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

WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
esp8266 projektjavasriptjson stringmqtt-broker-client-adapternodemcu tasmota mqttrelay-switchtasmota 1wire
45 Beiträge 19 Kommentatoren 11.7k Aufrufe 28 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.
  • wendy2702W wendy2702

    @homoran Hattest du eine Seite vorher schon :grinning:

    Frage mich welche Hochleistungszirkulationspumpe da zum Einsatzkommen muss damit das Warme wasser schneller am Hahn ist.

    Hat da jemand Erfahrungswerte?

    alkA Offline
    alkA Offline
    alk
    schrieb am zuletzt editiert von alk
    #30

    @wendy2702 Habe hier eininge Versuche gemacht und in einem typischen Haushalt/Haus mit Brauchwasserspeicher im Keller und Bäder im EG, OG, DG braucht eine typische Umwäzpumpe ca. 20sec und die Leitung ist genügend voll mit warmem Wasser. Von nun an kommt ja auch, ohne Pumpe, genügend warmes Wasser nach.

    • DIY Electronics that do their job
    • EV, WB, PV + Battery and optimized charging ;-)
    1 Antwort Letzte Antwort
    0
    • C Cumulus 0

      @alk
      Das Problem dieser Lösung ist doch, dass warmes Wasser zu spät kommt. Wenn ich warmes Wasser brauche, dann in dem Augenblick, wenn ich den Hahn öffne. Das Warmwasser kommt aber erst zwei Minuten später. Gut, man kann ja auch mal kalt duschen. Tut aber der Scheidungsquote nicht gut.
      Ich habe eine Funklösung realisiert, die wunderbar funktioniert. Im Bad und am Zugang zur Küche sind Taster, die die Umwälzpumpe einschalten. Das passt zeitlich fast immer. Und die Lösung ist käuflich und Plug'nPlay. Übrigens hatte ich eine manuelle Lösung ca. 20 Jahre drahtgebunden realisiert.

      Und in der Gästetoilette ist ein 16 A Klein-Durchlauferhitzer installiert. Der funktioniert sehr gut und ist kompatibel mit einer normalen Steckdose da nur Kurzzeitbetrieb. Eine sehr energiesparende Lösung, die auch einfach zu installieren ist, wenn eine Steckdose vorhanden ist.

      alkA Offline
      alkA Offline
      alk
      schrieb am zuletzt editiert von
      #31

      @cumulus-0 Mit einem Schlater ist es auch ein gute Möglichkeit. Aktuell braucht es bis warmes Wasser kommt ca. 20sec nachdem du das Wasser aufgedreht hast.

      • DIY Electronics that do their job
      • EV, WB, PV + Battery and optimized charging ;-)
      1 Antwort Letzte Antwort
      0
      • BananaJoeB Offline
        BananaJoeB Offline
        BananaJoe
        Most Active
        schrieb am zuletzt editiert von
        #32

        Also bei mir geht im Bad das Radio an wenn jemand Licht anmacht ... da könnte ich auch gleich die Pumpe 20 Sekunden laufen lassen ...

        Oder per ZigBee Türkontakt. Dann bräuchte es aber etwas um festzustellen ob man rein oder rausgeht. Oder man geht nach Zeit und ob sich die Wasseruhr vorher gedreht hat (was diese nicht getan haben sollte)

        ioBroker@Ubuntu 24.04 LTS (VMware) für: >260 Geräte, 5 Switche, 7 AP, 9 IP-Cam, 1 NAS 42TB, 1 ESXi 15TB, 4 Proxmox 1TB, 1 Hyper-V 48TB, 14 x Echo, 5x FireTV, 5 x Tablett/Handy VIS || >=160 Tasmota/Shelly || >=95 ZigBee || PV 8.1kW / Akku 14kWh || 2x USV 750W kaskadiert || Creality CR-10 SE 3D-Drucker

        Frederik BussF 1 Antwort Letzte Antwort
        1
        • BananaJoeB BananaJoe

          Also bei mir geht im Bad das Radio an wenn jemand Licht anmacht ... da könnte ich auch gleich die Pumpe 20 Sekunden laufen lassen ...

          Oder per ZigBee Türkontakt. Dann bräuchte es aber etwas um festzustellen ob man rein oder rausgeht. Oder man geht nach Zeit und ob sich die Wasseruhr vorher gedreht hat (was diese nicht getan haben sollte)

          Frederik BussF Offline
          Frederik BussF Offline
          Frederik Buss
          schrieb am zuletzt editiert von Frederik Buss
          #33

          @bananajoe Da hast Du mich auf eine super Idee gebracht. Ich hatte vorher schon die Zirkulationspumpe per Shelly angesteuert. Ich habe zwar im Haus auch 2 Wemos verbaut, aber für die Zirkulationspumpe finde ich die Shelly Lösung einfacher und wenn man den Eco Modus einschaltet und die Cloud ausschaltet ist der Stromverbrauch der Shellys auch wirklich niedrig (~0,4 W).
          Jedenfalls habe ich über Homematic ein kleines Script aktiviert, was die Pumpe für 2 Minuten laufen lässt, sowie eine Variable setzt, wenn der Lichtschalter betätigt wird. Täglich prüft morgens ein weiteres Script ob am Vortag die Pumpe gelaufen ist und schaltet automatisch ein, wenn nicht. Somit wird jeden Tag mindestens einmal das Wasser umgewälzt, Desinfektionsschaltung läuft nach wie vor wöchentlich.
          Im Bad ist zusätzlich ein Bewegungsmelder installiert, welcher aber das Licht nur gedimmt einschaltet. Somit drücken wir den Schalter in der Regel auch nur dann, wenn auch wirklich Bedarf besteht.

          1 Antwort Letzte Antwort
          2
          • H h07d0q

            Möchte mich hier mit meinen Gedanken anschließen, da ich die gleiche Idee / gleiche Ziel hatte, selber aber einen etwas anderen Weg gegangen bin.

            Zeitschaltuhr
            Ursprünglich war eine Zeitschaltuhr an der Zirkulationspumpe angeschlossen, welche die auf niedrigster Stufe laufende WW Zirkulationspumpe jeweils eine halbe Stunde über den Tag verteilt anschmiss.
            Danach tauschte ich die Zeitschaltuhr gegen ein Sonoff/Tasmota Relais. Die Zirkulation musste ca. 10 Minuten auf höchster Stufe laufen, bis die Temperatur im Rücklauf nicht mehr stieg. Also baute ich eine Rule mit einer Dauer von ca. 10 Minuten und schaltete mit den Timern die Pumpe an, über die Rule aus.

            Smarte Lösungsideen
            Folgende Lösungen standen/stehen zur Wahl:

            • Zeitschaltuhr nur bei Anwesenheit aktiv
            • Temperaturabhängig VL zu RL Temperatur
            • Bedarfsabhängig
              • Temperatursteigerung
              • Durchflussschalter (HT-120) oder Durchflusssensor (YF-B5 als Counter - ungenau, aber ausreichend als Schalter)

            Die Zeitschaltuhr in Tasmota über iobroker nur bei Anwesenheit mindestens einer Person zu aktivieren war mir nicht smart genug. Auch ein Schalten ab einer definierten Differenz, oder dem Verhältnis zwischen Vor und Rücklauftemperatur schied aus, da hier zwar ebenfalls mit der Anwesenheit gearbeitet werden könnte, aber trotzdem zu viel Wärmeverlust im WW Speicher auftreten würde.
            Bleiben also die Bedarfsabhängigen Lösungen übrig. Der Durchflussensor, oder -schalter war nicht vorhanden und müsse hinter/vor die Pumpe eingebaut werden, was ich mir nicht zutraute, wäre aber vermutlich die technisch bessere Lösung, da sie schneller reagiert.
            Aktuell habe ich es über die Temperatursteigerung gelöst, da (bis auf die Temperatursensoren) kein großartiger Umbauaufwand notwendig war.

            Umsetzung
            Ich stieß auf das Skript in diesem Post und passte es so an, dass ich nur die Temperaturänderung in einen Datenpunkt schrieb und diese mit Grafana loggte und erst mal die Lösung mit der Zeitschaltuhr analysierte:

            c8951f0c-a856-4c92-a02a-d18be9735757-image.png
            Die Zirkulationspumpe wird regelmäßig 14x am Tag eingeschaltet, ob Warmwasser benötigt wird, oder nicht. Ob jemand daheim ist, oder nicht.

            Deaktiviere ich die Zeitschaltuhr und aktiviere das Bedarfsskript, sieht das schon mal anders aus:
            efbb0096-b60d-446d-ba15-1c75ff451f91-image.png
            Es wurde seltener WW benötigt und die Pumpe bei jedem Bedarf aktiviert.
            Die Pumpe läuft nur noch so lange, bis der Rücklauf keine Temperatursteigerung mehr (unter angegebener Grenze) hat (ca. 8 Minuten, schwankend).
            Damit die Pumpe nicht gleich wieder abschaltet, weil die Temperatursteigerung im Rücklauf noch zu gering ist, ist eine Mindestlaufzeit eingebaut nach welcher erst die Temperaturänderung im Rücklauf geprüft wird.
            Um ein unnötiges weiteres Erhöhen der Temperatur zu vermeiden, habe ich eine Untergrenze für den Vorlauf eingebaut:
            ba4551fa-8481-4768-86e1-1c9cba82d021-image.png Man sieht schön wie um ca. 7 Uhr WW erzeugt wird und sich die Zuleitung aufgrund der aufsteigenden Temperatur erwärmt und wie ich um 0:30 Uhr noch Zähne geputzt habe :) Zwischen 17 und 19 Uhr war die Temperatur im Vorlauf wegen häufigen Bedarfen über dem Mindestwert, sodass die Pumpe nicht nachhelfen musste.

            Bei einem Tag mit Abwesenheit läuft die Pumpe noch seltener:
            8f22a265-250e-433b-9066-2d988a3113fe-image.png

            Ausreißer
            Da sie DS18B20 Sensoren hin und wieder seltsame Temperaturen zurückgeben und sich so Ausreißer nach oben und unten ergeben, habe ich im Skript ab einem Höchstwert von 5 die Spitzen abgeschnitten, bzw. wird der Datenpunkt nicht aktualisiert. Diese Ausreißer werden zusätzlich noch mit Hilfe des alten Messwerts vermittelt (h1 + speedVLold).

            Nachteile:

            • Verzögerung durch Aktualisierungsintervall von 10s und Trägheit des Temperaturanstiegs am Rohr zzgl. bis das WW an die Stichleitung gepumpt wird
            • iobroker muss laufen

            Fazit:
            Bisher läuft das Skript sehr gut, Bedarfe werden gut erkannt und nicht auf zu kleine Mengen reagiert. Wird immer wieder Warmwasser gezapft, bleibt die Leitung warm und die Pumpe aus, bedeutet jedoch, dass das Warmwasser in der Leitung bis zur letzten Zapfstelle abkühlt...
            Noch besser wäre wie beschrieben mit einem Durchflussensor schneller darauf zu reagieren, oder die gesammelten Daten in eine Art KI zu schieben und schon im Voraus zu erkennen, ob man gleich Warmwasser braucht :D aber dafür ist unser Bedarf vermutlich nicht regelmäßig genug...
            Eine Ersparnis konnte ich bisher nicht feststellen und werde ich im Nachhinein auch nicht auswerten können, da die Heizung noch nicht ganz korrekt am iobroker angebunden ist, aber sie müsste allein aufgrund der Tage in Abwesenheit, oder im Urlaub (habe nie die Zeitschaltuhr deaktiviert) da sein.
            Ich hoffe ich kann manch einem mit meinem Erfahrungsbericht helfen und somit auch mal was an die Community zurückgeben.

            hier noch der aktuelle Stand des Skripts mit allen (deaktivierten) Debug Meldungen während der Analyse:

            //https://forum.iobroker.net/post/133815
            //VL
            const idTempVL = 'sonoff.0.HWR.DS18B20-2_Temperature';
            const iddTVL = '0_userdata.0.WWZirkulationspumpe.dTVL';
            const swOn = 0.7;  // Grenzwert in K/min
            var speedVL
            var speedVLold = 0;
            //RL
            const idTempRL = 'sonoff.0.HWR.DS18B20-1_Temperature';
            const iddTRL = '0_userdata.0.WWZirkulationspumpe.dTRL';
            const swOff = 0.3;  // Grenzwert in K/min
            var speedRL
            var speedRLold = 0;
            
            var timer = null;
            const minTime = 60000   // Minimum Zeit in Millisekunden, welche die Pumpe laufen soll, bevor abgeschalten werden kann (TRL ist noch unter swOff)
            const minTemp = 36      // Minimum Temperatur, bevor die Pumpe wieder läuft
            var check = false;      // Check für minTime
            var check2 = 1;         // Check für minimalen speedVL für Ausschalten, sonst wird zu früh abgeschalten
            var h1, h2
            const idAktor = 'sonoff.0.HWR.POWER2';
            var aktor = getState(idAktor).val;
            on({id: idAktor, ack: true}, function(dp) {aktor = dp.state.val;});
            //////////////////////////////////////////////////////////
            /* Einschalten bei steigender Vorlauftemperatur */
            on(idTempVL, function(dp) {  // Triggern bei Wertänderung
               h1 = 60000 * (dp.state.val - dp.oldState.val) / (dp.state.lc - dp.oldState.lc);  // K/min
               speedVL = (h1 + speedVLold)/2;
               //console.debug(([Math.round(speedVL*100)/100,' speedVL = (',Math.round(h1*100)/100,' + ',Math.round(speedVLold*100)/100,')/2 K/min'].join('')));
               speedVLold = h1;
               if (speedVL < -5 || speedVL > 5) {return;}
               //console.debug((['state - oldState: ',dp.state.val,' - ',dp.oldState.val,' = ',Math.round((dp.state.val - dp.oldState.val)*100)/100].join('')));
               //console.debug((['TDiff: ',(dp.state.lc - dp.oldState.lc),'ms'].join('')));
               //console.debug(([speed,' K/min.'].join('')));
               setState(iddTVL, Math.round(speedVL*1000)/1000, true);
               
               if (speedVL >= swOn && !aktor && getState(idTempVL).val <= minTemp) {
                  setState(idAktor,true);
                  var messageText =['Zirkulationspumpe an.  (*dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                  //sendTo("telegram", "send", { text: messageText });
                  console.log((messageText));
                  
                  /* Prüfung mit Alarm */
                  if (!getState("0_userdata.0.Anwesenheit.Status.anyonePresent").val) {
                      var messageText =['Zirkulationspumpe an, obwohl niemand da ist!\r\n(*dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                      sendTo("telegram", "send", { text: messageText });
                      console.error((messageText));
                  }
                  //console.debug(([Math.round(speed*100)/100,' K/min'].join('')));
                  //console.debug((['Temperatur ist um mehr als ',gw,' K/min gestiegen.'].join('')));
                  //clearTimeout(timer);
                  timer = setTimeout(function() {
                      //if(aktor) setState(idAktor, false);
                    check = true
                  }, minTime);
               }
            });
            
            /* Ausschalten bei fallender Rücklauftemperatur, nach minimaler Zeit, bei stagnierender Vorlauftemperatur */
            on(idTempRL, function(dp) {  // Triggern bei Wertänderung
               h2 = 60000 * (dp.state.val - dp.oldState.val) / (dp.state.lc - dp.oldState.lc);  // K/min
               speedRL = (h2 + speedRLold)/2;
               //console.debug(([Math.round(speedRL*100)/100,' speedRL = (',Math.round(h2*100)/100,' + ',Math.round(speedRLold*100)/100,')/2 K/min'].join('')));
               speedRLold = h2;
               if (speedRL < -5 || speedRL > 5) {return;}
               setState(iddTRL, Math.round(speedRL*1000)/1000, true);
                if(speedRL <= swOff && speedRL > 0 && aktor && check && speedVL <= check2) {
                    clearTimeout(timer);
                    check = false
                    setState(idAktor,false);
                    var messageText =['Zirkulationspumpe aus. (dTVL: ',Math.round(speedVL*1000)/1000,', *dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                    //sendTo("telegram", "send", { text: messageText });
                    console.log((messageText));
                }
            });
            
            //Debug
            /*
            on({id: new RegExp(idTempVL + "$|" + idTempRL + "$"), change: "ne"}, async function (obj) {
                console.debug((['(dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,', aktor: ',aktor,', timeout: ',check,')'].join('')));
            });
            */
            
            I Offline
            I Offline
            IlmenauRatte
            schrieb am zuletzt editiert von
            #34

            @h07d0q Ich habe das mit einem sonoff Basic R3 gelöst.
            Da hat man esp, Relais und Netzteil alles in einem Gerät.
            Viel besser als Rules ist Script, dazu muss man tasmota selbst kompilieren, das ist aber sehr easy.
            Und wenn man original maxim ds18b20 bestellt, hat man auch keine Temperatur Ausreißer.

            1 Antwort Letzte Antwort
            1
            • H h07d0q

              @alk Richtig, genau so ist es aufgebaut (in diesem Fall ein Sonoff Dual R2, der auch die Außenbeleuchtung schaltet)
              wiffi-pump habe ich davor auch gesehen, möglicherweise hat er mich inspiriert ;)

              Ich hab das Skript oben mit meiner aktuellen Version aktualisiert - es kamen ein paar Kommentare dazu und eine Alarmmeldung wenn niemand im Haus ist und die Zirkulationspumpe aktiviert wird (zu Testzwecken und jetzt drin geblieben).
              731ece0d-0d2e-4460-a279-2a772a1dad46-image.png
              Zu Analysezwecken habe ich auch eine Heatmap in Grafana aufgebaut :D

              Natürlich wäre es schicker wenn die Logik wie bei Eugen Stall alles im Mikrocontroller umgesetzt wäre, dann hätte man eine kürzere Verzögerung für das Zuschalten der Pumpe. Das mit der Auswertung und Analyse müsste man dann anders lösen wenn man das möchte. Und ich bräuchte dann einen weiteren ESP nur für diese Aufgabe, außer man bekommt das irgendwie auch mit Tasmota Rules hin.
              Naja wer weiß... "irgendwann" mal ;)

              NoschvieN Offline
              NoschvieN Offline
              Noschvie
              schrieb am zuletzt editiert von
              #35

              Hallo @h07d0q
              wie ist deine Langzeit-Erfahrung mit deiner Steuerung?
              Ist deine akt. Version im Web zu finden? Möchte sie gerne auch einsetzen bzw. umsetzen, danke im Voraus!

              1 Antwort Letzte Antwort
              0
              • HomoranH Homoran

                habt ihr euch mal bei stall.biz den wiffi-pump angesehen?

                NoschvieN Offline
                NoschvieN Offline
                Noschvie
                schrieb am zuletzt editiert von
                #36

                @homoran sagte in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                habt ihr euch mal bei stall.biz den wiffi-pump angesehen?

                Der Algorithmus ist leider nicht Open Source, die Platine sieht eigentlich ganz gut und brauchbar aus.

                1 Antwort Letzte Antwort
                0
                • H Offline
                  H Offline
                  h07d0q
                  schrieb am zuletzt editiert von h07d0q
                  #37

                  @noschvie
                  meine aktuelle Version habe ich minimal angepasst.

                  //https://forum.iobroker.net/post/133815
                  //VL
                  const idTempVL = 'sonoff.0.HWR.DS18B20-2_Temperature';
                  const iddTVL = '0_userdata.0.WWZirkulationspumpe.dTVL';
                  const swOn = 0.7;  // Grenzwert in K/min
                  var speedVL
                  var speedVLold = 0;
                  //RL
                  const idTempRL = 'sonoff.0.HWR.DS18B20-1_Temperature';
                  const iddTRL = '0_userdata.0.WWZirkulationspumpe.dTRL';
                  const swOff = 0.3;  // Grenzwert in K/min
                  var speedRL
                  var speedRLold = 0;
                  
                  var timer = null, alarmTimer;
                  var iAlarmTimer = 40*60000;   // Wenn die Pumpe außergewöhnlich lange läuft
                  const minTime = 120000;   // Minimum Zeit in Millisekunden, welche die Pumpe laufen soll, bevor abgeschalten werden kann (TRL ist noch unter swOff)
                  const minTemp = 38;      // Minimum Temperatur, bevor die Pumpe wieder läuft
                  const minPercent = 0.8;  // Minimum Prozent von RL/VL bevor abgeschalten wird
                  var checkMinTimeErreicht = false;      // Check für minTime
                  var checkMinSpeedVL = 1;         // Check für minimalen speedVL für Ausschalten, sonst wird zu früh abgeschalten
                  var h1, h2
                  const idAktor = 'sonoff.0.HWR.POWER2';
                  var aktor = getState(idAktor).val;
                  on({id: idAktor, ack: true}, function(dp) {aktor = dp.state.val;});
                  
                  // Erweiterter Log im ioBroker
                  const LOG_INFO = true;    // Informationen loggen
                  const LOG_DEBUG = false;   // Erweiterter Log für Debugging
                  const Telegram_DEBUG = false;   // Erweiterter Log für Debugging
                  
                  
                  //////////////////////////////////////////////////////////
                  /* Einschalten bei steigender Vorlauftemperatur */
                  on(idTempVL, function(dp) {  // Triggern bei Wertänderung
                     h1 = 60000 * (dp.state.val - dp.oldState.val) / (dp.state.lc - dp.oldState.lc);  // K/min
                     speedVL = (h1 + speedVLold)/2;
                     //if (LOG_DEBUG) console.debug(([Math.round(speedVL*100)/100,' speedVL = (',Math.round(h1*100)/100,' + ',Math.round(speedVLold*100)/100,')/2 K/min'].join('')));
                     speedVLold = h1;
                     if (speedVL < -5 || speedVL > 5) {return;}
                     //if (LOG_DEBUG) console.debug((['state - oldState: ',dp.state.val,' - ',dp.oldState.val,' = ',Math.round((dp.state.val - dp.oldState.val)*100)/100].join('')));
                     //if (LOG_DEBUG) console.debug((['TDiff: ',(dp.state.lc - dp.oldState.lc),'ms'].join('')));
                     //if (LOG_DEBUG) console.debug(speedVL + ' K/min.');
                     setState(iddTVL, Math.round(speedVL*1000)/1000, true);
                     
                     if (LOG_DEBUG) console.debug('VL: ' + speedVL + ' >= ' + swOn + ' & ' + !aktor + ' & ' + getState(idTempVL).val + ' <= ' + minTemp);
                     if (speedVL >= swOn && !aktor && getState(idTempVL).val <= minTemp) {
                        setState(idAktor,true);
                        var messageText =['Zirkulationspumpe an.  (*dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                        //if (Telegram_DEBUG) sendTo("telegram", "send", { text: messageText });
                        if (LOG_INFO) console.log((messageText));
                        
                        /* Prüfung mit Alarm */
                        if (!getState("0_userdata.0.Anwesenheit.Status.anyonePresent").val) {
                            var messageText =['Zirkulationspumpe an, obwohl niemand da ist!\r\n(*dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                            sendTo("telegram", "send", { text: messageText });
                            console.error((messageText));
                        }
                        if (LOG_INFO) console.log(Math.round(speedVL*100)/100 + ' K/min');
                        if (LOG_INFO) console.log('Temperatur ist um mehr als ' + swOn + ' K/min gestiegen.');
                        //clearTimeout(timer);
                        timer = setTimeout(function() {
                            //if(aktor) setState(idAktor, false);
                          checkMinTimeErreicht = true
                        }, minTime);
                        alarmTimer = setTimeout(function() {
                          var messageText = 'speedRL: ' + Math.round(speedRL*1000)/1000 + ' <= ' + swOff + '\r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' > 0 \r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' > ' + Math.round(speedRLold*1000)/1000 + '(old)\r\naktor: ' + aktor + '\r\ncheckMinTimeErreicht: ' + checkMinTimeErreicht + '\r\nSpeedVl: ' + Math.round(speedVL*1000)/1000 + ' <= ' + checkMinSpeedVL + '\r\nRL/VL Temp: ' + (getState(idTempRL).val+4.0) + '/' + getState(idTempVL).val + ' = ' + Math.round(((getState(idTempRL).val+4.0)/getState(idTempVL).val)*100)/100 + ' > ' +  minPercent;
                          sendTo("telegram", "send", { text: 'Zirkulationspumpe läuft seit mehr als ' + iAlarmTimer/60000 + ' Minuten!\r\n\r\n' + messageText });
                        }, iAlarmTimer);
                     }
                  });
                  
                  /* Ausschalten bei fallender Rücklauftemperatur, nach minimaler Zeit, bei stagnierender Vorlauftemperatur */
                  /* neu: minPercent */
                  on(idTempRL, function(dp) {  // Triggern bei Wertänderung
                      h2 = 60000 * (dp.state.val - dp.oldState.val) / (dp.state.lc - dp.oldState.lc);  // K/min
                      speedRL = (h2 + speedRLold)/2;
                      //if (LOG_DEBUG) console.debug(([Math.round(speedRL*100)/100,' speedRL = (',Math.round(h2*100)/100,' + ',Math.round(speedRLold*100)/100,')/2 K/min'].join('')));
                      speedRLold = h2;
                      if (speedRL < -5 || speedRL > 5) {return;}
                      setState(iddTRL, Math.round(speedRL*1000)/1000, true);
                      var messageText = 'speedRL: ' + Math.round(speedRL*1000)/1000 + ' <= ' + swOff + '\r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' > 0 (deaktiviert) \r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' < ' + Math.round(speedRLold*1000)/1000 + '(old)\r\naktor: ' + aktor + '\r\ncheckMinTimeErreicht: ' + checkMinTimeErreicht + '\r\nSpeedVl: ' + Math.round(speedVL*1000)/1000 + ' <= ' + checkMinSpeedVL + '\r\nRL/VL Temp: ' + (getState(idTempRL).val+4.0) + '/' + getState(idTempVL).val + ' = ' + Math.round(((getState(idTempRL).val+4.0)/getState(idTempVL).val)*100)/100 + ' > ' +  minPercent;
                      if (LOG_DEBUG) console.debug('RL! ' + messageText);
                      //if(speedRL <= swOff && speedRL > 0 && speedRL < speedRLold && aktor && checkMinTimeErreicht && speedVL <= checkMinSpeedVL && (getState(idTempRL).val/getState(idTempVL).val) > minPercent) {
                      if(speedRL <= swOff && speedRL < speedRLold && aktor && checkMinTimeErreicht && speedVL <= checkMinSpeedVL && (getState(idTempRL).val/getState(idTempVL).val) > minPercent) {
                          clearTimeout(timer);
                          checkMinTimeErreicht = false
                          setState(idAktor,false);
                          messageText = 'Zirkulationspumpe aus\r\n' + messageText
                          if (Telegram_DEBUG) sendTo("telegram", "send", { text: messageText });
                          if (LOG_INFO) console.log((messageText));
                          clearTimeout(alarmTimer);
                      }
                  });
                  
                  //Debug
                  /*
                  if (LOG_DEBUG) {
                  on({id: new RegExp(idTempVL + "$|" + idTempRL + "$"), change: "ne"}, async function (obj) {
                      console.debug((['(dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,', aktor: ',aktor,', timeout: ',checkMinTimeErreicht ,')'].join('')));
                  });
                  }
                  */
                  

                  Das läuft so jetzt schon seit mehr als zwei Jahren und meine Frau hat sich nicht beschwert :grin: Die Infos per Telegram müsste ich eigentlich mal einstampfen. Der Alarm bei zu langer Laufzeit ist auf jeden Fall hilfreich, manchmal ist es in Fehlalarm, wenn der Aktor seit der Aktivierung keine WLAN Verbindung hat z.B.. Wie oben schon erwähnt, ist es nicht zu erwarten, dass beim Zapfen direkt Heißwasser kommt, aber nach kurzer Zeit, oder wenn man kurz zapft und dann wartet.

                  NoschvieN 1 Antwort Letzte Antwort
                  1
                  • H h07d0q

                    @noschvie
                    meine aktuelle Version habe ich minimal angepasst.

                    //https://forum.iobroker.net/post/133815
                    //VL
                    const idTempVL = 'sonoff.0.HWR.DS18B20-2_Temperature';
                    const iddTVL = '0_userdata.0.WWZirkulationspumpe.dTVL';
                    const swOn = 0.7;  // Grenzwert in K/min
                    var speedVL
                    var speedVLold = 0;
                    //RL
                    const idTempRL = 'sonoff.0.HWR.DS18B20-1_Temperature';
                    const iddTRL = '0_userdata.0.WWZirkulationspumpe.dTRL';
                    const swOff = 0.3;  // Grenzwert in K/min
                    var speedRL
                    var speedRLold = 0;
                    
                    var timer = null, alarmTimer;
                    var iAlarmTimer = 40*60000;   // Wenn die Pumpe außergewöhnlich lange läuft
                    const minTime = 120000;   // Minimum Zeit in Millisekunden, welche die Pumpe laufen soll, bevor abgeschalten werden kann (TRL ist noch unter swOff)
                    const minTemp = 38;      // Minimum Temperatur, bevor die Pumpe wieder läuft
                    const minPercent = 0.8;  // Minimum Prozent von RL/VL bevor abgeschalten wird
                    var checkMinTimeErreicht = false;      // Check für minTime
                    var checkMinSpeedVL = 1;         // Check für minimalen speedVL für Ausschalten, sonst wird zu früh abgeschalten
                    var h1, h2
                    const idAktor = 'sonoff.0.HWR.POWER2';
                    var aktor = getState(idAktor).val;
                    on({id: idAktor, ack: true}, function(dp) {aktor = dp.state.val;});
                    
                    // Erweiterter Log im ioBroker
                    const LOG_INFO = true;    // Informationen loggen
                    const LOG_DEBUG = false;   // Erweiterter Log für Debugging
                    const Telegram_DEBUG = false;   // Erweiterter Log für Debugging
                    
                    
                    //////////////////////////////////////////////////////////
                    /* Einschalten bei steigender Vorlauftemperatur */
                    on(idTempVL, function(dp) {  // Triggern bei Wertänderung
                       h1 = 60000 * (dp.state.val - dp.oldState.val) / (dp.state.lc - dp.oldState.lc);  // K/min
                       speedVL = (h1 + speedVLold)/2;
                       //if (LOG_DEBUG) console.debug(([Math.round(speedVL*100)/100,' speedVL = (',Math.round(h1*100)/100,' + ',Math.round(speedVLold*100)/100,')/2 K/min'].join('')));
                       speedVLold = h1;
                       if (speedVL < -5 || speedVL > 5) {return;}
                       //if (LOG_DEBUG) console.debug((['state - oldState: ',dp.state.val,' - ',dp.oldState.val,' = ',Math.round((dp.state.val - dp.oldState.val)*100)/100].join('')));
                       //if (LOG_DEBUG) console.debug((['TDiff: ',(dp.state.lc - dp.oldState.lc),'ms'].join('')));
                       //if (LOG_DEBUG) console.debug(speedVL + ' K/min.');
                       setState(iddTVL, Math.round(speedVL*1000)/1000, true);
                       
                       if (LOG_DEBUG) console.debug('VL: ' + speedVL + ' >= ' + swOn + ' & ' + !aktor + ' & ' + getState(idTempVL).val + ' <= ' + minTemp);
                       if (speedVL >= swOn && !aktor && getState(idTempVL).val <= minTemp) {
                          setState(idAktor,true);
                          var messageText =['Zirkulationspumpe an.  (*dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                          //if (Telegram_DEBUG) sendTo("telegram", "send", { text: messageText });
                          if (LOG_INFO) console.log((messageText));
                          
                          /* Prüfung mit Alarm */
                          if (!getState("0_userdata.0.Anwesenheit.Status.anyonePresent").val) {
                              var messageText =['Zirkulationspumpe an, obwohl niemand da ist!\r\n(*dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,')'].join('');
                              sendTo("telegram", "send", { text: messageText });
                              console.error((messageText));
                          }
                          if (LOG_INFO) console.log(Math.round(speedVL*100)/100 + ' K/min');
                          if (LOG_INFO) console.log('Temperatur ist um mehr als ' + swOn + ' K/min gestiegen.');
                          //clearTimeout(timer);
                          timer = setTimeout(function() {
                              //if(aktor) setState(idAktor, false);
                            checkMinTimeErreicht = true
                          }, minTime);
                          alarmTimer = setTimeout(function() {
                            var messageText = 'speedRL: ' + Math.round(speedRL*1000)/1000 + ' <= ' + swOff + '\r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' > 0 \r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' > ' + Math.round(speedRLold*1000)/1000 + '(old)\r\naktor: ' + aktor + '\r\ncheckMinTimeErreicht: ' + checkMinTimeErreicht + '\r\nSpeedVl: ' + Math.round(speedVL*1000)/1000 + ' <= ' + checkMinSpeedVL + '\r\nRL/VL Temp: ' + (getState(idTempRL).val+4.0) + '/' + getState(idTempVL).val + ' = ' + Math.round(((getState(idTempRL).val+4.0)/getState(idTempVL).val)*100)/100 + ' > ' +  minPercent;
                            sendTo("telegram", "send", { text: 'Zirkulationspumpe läuft seit mehr als ' + iAlarmTimer/60000 + ' Minuten!\r\n\r\n' + messageText });
                          }, iAlarmTimer);
                       }
                    });
                    
                    /* Ausschalten bei fallender Rücklauftemperatur, nach minimaler Zeit, bei stagnierender Vorlauftemperatur */
                    /* neu: minPercent */
                    on(idTempRL, function(dp) {  // Triggern bei Wertänderung
                        h2 = 60000 * (dp.state.val - dp.oldState.val) / (dp.state.lc - dp.oldState.lc);  // K/min
                        speedRL = (h2 + speedRLold)/2;
                        //if (LOG_DEBUG) console.debug(([Math.round(speedRL*100)/100,' speedRL = (',Math.round(h2*100)/100,' + ',Math.round(speedRLold*100)/100,')/2 K/min'].join('')));
                        speedRLold = h2;
                        if (speedRL < -5 || speedRL > 5) {return;}
                        setState(iddTRL, Math.round(speedRL*1000)/1000, true);
                        var messageText = 'speedRL: ' + Math.round(speedRL*1000)/1000 + ' <= ' + swOff + '\r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' > 0 (deaktiviert) \r\nspeedRL: ' + Math.round(speedRL*1000)/1000 + ' < ' + Math.round(speedRLold*1000)/1000 + '(old)\r\naktor: ' + aktor + '\r\ncheckMinTimeErreicht: ' + checkMinTimeErreicht + '\r\nSpeedVl: ' + Math.round(speedVL*1000)/1000 + ' <= ' + checkMinSpeedVL + '\r\nRL/VL Temp: ' + (getState(idTempRL).val+4.0) + '/' + getState(idTempVL).val + ' = ' + Math.round(((getState(idTempRL).val+4.0)/getState(idTempVL).val)*100)/100 + ' > ' +  minPercent;
                        if (LOG_DEBUG) console.debug('RL! ' + messageText);
                        //if(speedRL <= swOff && speedRL > 0 && speedRL < speedRLold && aktor && checkMinTimeErreicht && speedVL <= checkMinSpeedVL && (getState(idTempRL).val/getState(idTempVL).val) > minPercent) {
                        if(speedRL <= swOff && speedRL < speedRLold && aktor && checkMinTimeErreicht && speedVL <= checkMinSpeedVL && (getState(idTempRL).val/getState(idTempVL).val) > minPercent) {
                            clearTimeout(timer);
                            checkMinTimeErreicht = false
                            setState(idAktor,false);
                            messageText = 'Zirkulationspumpe aus\r\n' + messageText
                            if (Telegram_DEBUG) sendTo("telegram", "send", { text: messageText });
                            if (LOG_INFO) console.log((messageText));
                            clearTimeout(alarmTimer);
                        }
                    });
                    
                    //Debug
                    /*
                    if (LOG_DEBUG) {
                    on({id: new RegExp(idTempVL + "$|" + idTempRL + "$"), change: "ne"}, async function (obj) {
                        console.debug((['(dTVL: ',Math.round(speedVL*1000)/1000,', dTRL: ',Math.round(speedRL*1000)/1000,', aktor: ',aktor,', timeout: ',checkMinTimeErreicht ,')'].join('')));
                    });
                    }
                    */
                    

                    Das läuft so jetzt schon seit mehr als zwei Jahren und meine Frau hat sich nicht beschwert :grin: Die Infos per Telegram müsste ich eigentlich mal einstampfen. Der Alarm bei zu langer Laufzeit ist auf jeden Fall hilfreich, manchmal ist es in Fehlalarm, wenn der Aktor seit der Aktivierung keine WLAN Verbindung hat z.B.. Wie oben schon erwähnt, ist es nicht zu erwarten, dass beim Zapfen direkt Heißwasser kommt, aber nach kurzer Zeit, oder wenn man kurz zapft und dann wartet.

                    NoschvieN Offline
                    NoschvieN Offline
                    Noschvie
                    schrieb am zuletzt editiert von
                    #38

                    @h07d0q sagte in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                    meine aktuelle Version

                    Danke! Möchte gerne Zeit investieren und diesen Algorithmus unter Tasmota mit Berry implementieren... mal sehen, ob ChatGPT dafür eine Hilfe ist.

                    H 1 Antwort Letzte Antwort
                    0
                    • NoschvieN Noschvie

                      @h07d0q sagte in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                      meine aktuelle Version

                      Danke! Möchte gerne Zeit investieren und diesen Algorithmus unter Tasmota mit Berry implementieren... mal sehen, ob ChatGPT dafür eine Hilfe ist.

                      H Offline
                      H Offline
                      h07d0q
                      schrieb am zuletzt editiert von
                      #39

                      @noschvie said in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                      mal sehen, ob ChatGPT dafür eine Hilfe ist.

                      Viel Erfolg :grimacing:

                      NoschvieN 1 Antwort Letzte Antwort
                      0
                      • H h07d0q

                        @noschvie said in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                        mal sehen, ob ChatGPT dafür eine Hilfe ist.

                        Viel Erfolg :grimacing:

                        NoschvieN Offline
                        NoschvieN Offline
                        Noschvie
                        schrieb am zuletzt editiert von
                        #40

                        @h07d0q die Analyse durch ChatGPT findest du hier:
                        https://gist.github.com/Noschvie/239cfa9c463f940ff0bd7a9bdc1bdebe

                        Nun geht's an die Transferierung bzw. Konvertierung nach Berry auf ein Tasmota Device...

                        H 1 Antwort Letzte Antwort
                        1
                        • NoschvieN Noschvie

                          @h07d0q die Analyse durch ChatGPT findest du hier:
                          https://gist.github.com/Noschvie/239cfa9c463f940ff0bd7a9bdc1bdebe

                          Nun geht's an die Transferierung bzw. Konvertierung nach Berry auf ein Tasmota Device...

                          H Offline
                          H Offline
                          h07d0q
                          schrieb am zuletzt editiert von
                          #41

                          @noschvie said in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                          geht's

                          Ohh interessant! Vor allem, dass es vermutlich auch über Rules gehen würde, allerdings vermisse ich den Teil der Rücklauftemperatur-Überwachung zur Abschaltung...

                          Schon komisch so eine detaillierte Analyse seines zusammengefrickelten Codes zu lesen:grin:

                          NoschvieN 1 Antwort Letzte Antwort
                          0
                          • H h07d0q

                            @noschvie said in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:

                            geht's

                            Ohh interessant! Vor allem, dass es vermutlich auch über Rules gehen würde, allerdings vermisse ich den Teil der Rücklauftemperatur-Überwachung zur Abschaltung...

                            Schon komisch so eine detaillierte Analyse seines zusammengefrickelten Codes zu lesen:grin:

                            NoschvieN Offline
                            NoschvieN Offline
                            Noschvie
                            schrieb am zuletzt editiert von
                            #42

                            @h07d0q der Berry Code ist fehlerhaft, was die Syntax betrifft. Aber ich komme trotzdem weiter, durch Nachfragen und google...
                            Habe mir eine Berry Class erstellt zum Tracken der Vor- und Rücklauf-Temperatur und zum Berechnen der Speed usw... es dauert weil unerfahren mit Berry, aber es wird...
                            In welchem Intervall werden bei dir die Trigger Funktionen aufgerufen?

                            NoschvieN 1 Antwort Letzte Antwort
                            0
                            • NoschvieN Noschvie

                              @h07d0q der Berry Code ist fehlerhaft, was die Syntax betrifft. Aber ich komme trotzdem weiter, durch Nachfragen und google...
                              Habe mir eine Berry Class erstellt zum Tracken der Vor- und Rücklauf-Temperatur und zum Berechnen der Speed usw... es dauert weil unerfahren mit Berry, aber es wird...
                              In welchem Intervall werden bei dir die Trigger Funktionen aufgerufen?

                              NoschvieN Offline
                              NoschvieN Offline
                              Noschvie
                              schrieb am zuletzt editiert von
                              #43

                              Hab's gefunden: die Trigger Funktionen werden im Inerval von 10 Sekunden aufgerufen.

                              H 1 Antwort Letzte Antwort
                              0
                              • NoschvieN Noschvie

                                Hab's gefunden: die Trigger Funktionen werden im Inerval von 10 Sekunden aufgerufen.

                                H Offline
                                H Offline
                                h07d0q
                                schrieb am zuletzt editiert von
                                #44

                                @noschvie oh sorry, deine Frage im letzten Post habe ich übersehen.. die Trigger reagieren auf Wertänderung der States vom Tasmota Sensor. Da dieser im Standard alle 10s abgerufen wird, sollte das nicht in meinem Code stehen, da dort die Zeit zwischen neuem und allem Trigger zum Rechnen verwendet wird und nicht starre 10s. Ich könnte mir vermutlich eine eigene Tasmota Firmware kompilieren, welche die Sensoren öfter über MQTT raushaut, aber es funktioniert auch so ausreichend gut.

                                1 Antwort Letzte Antwort
                                0
                                • M Offline
                                  M Offline
                                  mf2105
                                  schrieb am zuletzt editiert von
                                  #45

                                  @alk tldr, wollte ich auch mal so lösen. Inzwischen stehen einfach ein Echo DOT bzw Plus (mit Zigbee) in Küche und Bad (u.a.), die auch das Licht, Musik, Radio, Rolläden steuern und die Türklingel (Ring) signalisieren.
                                  An der WWZP ist einfach eine Zigbee- Steckdose zwischengesteckt. Wenn nun jmd WW braucht sagt man einfach "Alexa, Wasser" und die ZP läuft für 1min und gut ist..
                                  Mehr Energie kann man glaube ich nicht sparen...

                                  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

                                  759

                                  Online

                                  32.5k

                                  Benutzer

                                  81.8k

                                  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