NEWS
WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten
-
@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.
-
@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 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.
-
@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.
-
@noschvie said in WW Zirkulationspumpe bedarfsgerecht ein- und ausschalten:
mal sehen, ob ChatGPT dafür eine Hilfe ist.
Viel Erfolg
-
@h07d0q die Analyse durch ChatGPT findest du hier:
https://gist.github.com/Noschvie/239cfa9c463f940ff0bd7a9bdc1bdebeNun geht's an die Transferierung bzw. Konvertierung nach Berry auf ein Tasmota Device...
-
@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
-
@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? -
Hab's gefunden: die Trigger Funktionen werden im Inerval von 10 Sekunden aufgerufen.
-
@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.
-
@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...