Last active
September 6, 2024 05:53
-
-
Save Noschvie/239cfa9c463f940ff0bd7a9bdc1bdebe to your computer and use it in GitHub Desktop.
"Circulating Hot Water Pump" Controller (https://forum.iobroker.net/post/133815)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//https://forum.iobroker.net/post/133815 | |
//VL, outgoing temperature | |
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, return temperature | |
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(''))); | |
}); | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
In Berry für Tasmota kannst du Klassen erstellen, die ähnlich wie in JavaScript oder Python funktionieren. Um eine Klasse zu erstellen, die die aktuelle Temperatur, den aktuellen Timestamp sowie die vorherige Temperatur und den vorherigen Timestamp speichert, kannst du die folgende Struktur verwenden.
Beispiel: Erstellen einer Klasse in Berry
Hier ist ein Beispiel für eine Klasse, die die Temperatur- und Zeitstempel-Daten speichert:
Erläuterung:
construct()
wird beim Erstellen einer Instanz der Klasse aufgerufen. Hier werden die Werte für Temperatur und Timestamp initialisiert.update()
-Methode: Diese Methode wird verwendet, um die aktuellen Werte der Temperatur und des Zeitstempels zu aktualisieren. Die vorherigen Werte werden ebenfalls gespeichert.display()
-Methode: Diese Methode zeigt die aktuellen und vorherigen Temperaturen sowie die zugehörigen Zeitstempel an.Funktionsweise:
update()
-Methode aufgerufen wird, speichert sie die aktuellen Werte in den "vorherigen" Variablen und setzt die neuen Werte als "aktuelle".display()
-Methode kannst du die aktuellen und vorherigen Temperaturen und Zeitstempel in der Konsole anzeigen.In deinem spezifischen Fall, wenn du mit Tasmota arbeitest, kannst du die
system_time()
-Funktion verwenden, um den aktuellen Timestamp zu erhalten. Die Temperatur kann beispielsweise von einem Sensor gelesen werden, indem du eine passende Funktion dafür aufrufst.