NEWS
Poolpumpe, Solarsteuerung, PH Dosierung bräuchte etwas Hilfe
-
Hi all,
bin dabei meine Pool Steuerung fertig zu stellen, bräuchte aber etwas Hilfe bei den Scripten.
Zunächst die Punkte die ich realisieren möchte:Punkt 1:
Bei einer Differenztemperatur (Pool/Absorber) von 4 Grad soll das Ventil zum Absorber geschaltet werden.
Da die Temperatur vom Pool im Ansaugrohr gemessen wird, steigt diese meist noch 1-2 Grad, wenn die Pumpe läuft. Daher soll bei erreichen der Diff Temperatur die Pumpe erst ca. 5 min laufen, dann soll wiederum geprüft werden, ob die Diff Temperatur immer noch größer 4 ist.
Wenn dem so ist, soll das Ventil zum Absorber geschaltet werden, ist die Temperatur aber nach den 5 Minuten Laufzeit wieder kleiner 4 soll das Ventil nicht geschaltet werden und die Pumpe wieder aus.Punkt 2:
Wie kann ich per Script die Laufzeit der Pumpe berechnen? Die Pumpe soll 6h am Tag laufen. Normalerweise 3h morgens, 3h Abends. Wird aber tagsüber die Pumpe angeschaltet, weil über den Absorber gepumpt wird, soll sie Abends nicht mehr laufen. Und in VIS hätte ich diese Laufzeit auch gerne.Punkt 3:
Wenn die Poolpumpe morgens oder Abends automatisch eingeschaltet wird, sollen nach 10min der PH und Chlor Wert geprüft werden. Sind die Werte darunter, soll 2min dosiert werden, dann aus, nach 10min soll wieder geprüft werden und je nach dem wieder dosiert werden oder nicht.Hier mal mein Versuch zu Punkt 1:
//Diff Temp größer 4 Grad on({ id: 'mqtt.0.Poolsteuerung.DTemp.T'/*Poolsteuerung/DTemp/T*/, change: "ne", valGt: 4, oldValLe: 4, logic: "and" }, function () { var sperre = getState('javascript.0.Pool.Pumpensperre.manuell').val; var pooltemp = getState('mqtt.0.Poolsteuerung.PTemp').val; setState('hm-rpc.0.NEQ0116143.1.STATE', true); sendTo('telegram.0', 'DiffTemp erreicht, Pumpe wird eingeschaltet, dann nochmal geprüft'); var intervall1 = setInterval(function(){ var difftemp = getState('mqtt.0.Poolsteuerung.DTemp.T').val; if ( difftemp >= 4 && sperre === false){ sendTo('telegram.0', "DiffTemp ist größer 4°C, Wert ist: " + difftemp + '°C' + " Ventil wird nach Solar geschaltet, Pumpe schon 5min aktiv"); setState('mqtt.0.Poolsteuerung.GPIO.25'/*Relais1*/, 0); setState('mqtt.0.Poolsteuerung.GPIO.26'/*Relais2*/,1); clearInterval(intervall1); } } ,20000); }); //Diff Temp kleiner 2 Grad on({ id: 'mqtt.0.Poolsteuerung.DTemp.T'/*Poolsteuerung/DifferenzTemp/DiffTemp*/, change: "ne", valLt: 2, oldValGe: 2, logic: "and" }, function () { var difftemp = getState('mqtt.0.Poolsteuerung.DTemp.T').val; sendTo('telegram.0', "Differenztemperatur ist kleiner 2°C, Wert ist: " + difftemp + '°C' + " Ventil wird nach Pool geschaltet und Pumpe aus"); setState('mqtt.0.Poolsteuerung.GPIO.25'/*Relais1*/, 1); setState('mqtt.0.Poolsteuerung.GPIO.26'/*Relais2*/,0); setState('hm-rpc.0.NEQ0116143.1.STATE', false); });
Funktioniert beim ersten Test auch soweit. Ist die Temperatur kleiner 2 könnte ich den interval beim trigger unter 2 Grad wieder löschen, aber wie komme ich aus dem interval wieder raus, wenn die Temperatur kleiner 4 aber größer 2 ist.
Zu Punkt 2 hab ich leider so gar keine Idee wollte es mit mytime Adapter lösen, wollte beim ersten Test aber auch nicht so, wie ich will. Schau ich mir nochmal an, aber vllt ist es mit Script viel einfacher.
Zu Punkt 3: Dass die Pumpe variabel über VIS zu bestimmter Zeit ein/aus geschaltet wird habe ich schon laufen, dass ich nach 10 min Laufzeit die Werte prüfe, denk ich bekomme ich auch hin, aber wie löse ich es, dass immer nach 10 min nochmal geprüft wird und gegebenenfalls nochmal Nachdosiert wird?
//Pumpe morgens EIN const idEinMorgens = 'javascript.0.Pool.EinschaltzeitMorgens'; //als String "hh:mm" var t = getState(idEinMorgens).val.split(':'); var timer = schedule(t[1] + ' ' + t[0] + ' * * *', function() { if (getState("javascript.0.Pool.PumpeAktiv").val === true ){ if(getState('mqtt.0.Poolsteuerung.End_P.S'/*Poolsteuerung/End P/S*/).val === 1){ setState("hm-rpc.0.NEQ0116143.1.STATE"/*Pool Pumpe.STATE*/, true); sendTo('telegram', "Pool Pumpe morgens EIN, Ventil Pool"); log("Pumpe ein nach restart"); } if ((getState('mqtt.0.Poolsteuerung.End_S.S'/*Poolsteuerung/End S/S*/).val === 1) && (getState('mqtt.0.Poolsteuerung.End_Rueck.S'/*Poolsteuerung/End Rueck/S*/).val === 1)){ setState("hm-rpc.0.NEQ0116143.1.STATE"/*Pool Pumpe.STATE*/, true); sendTo('telegram', "Pool Pumpe morgens EIN, Ventil Solar & Rücklauf offen"); } } }); on(idEinMorgens, function(dp) { t = dp.state.val.split(':'); clearSchedule(timer); timer = schedule(t[1] + ' ' + t[0] + ' * * *', function() { if (getState("javascript.0.Pool.PumpeAktiv").val === true ){ if(getState('mqtt.0.Poolsteuerung.End_P.S'/*Poolsteuerung/End P/S*/).val === 1){ setState("hm-rpc.0.NEQ0116143.1.STATE"/*Pool Pumpe.STATE*/, true); sendTo('telegram', "Pool Pumpe morgens EIN, Ventil Pool"); log("Pumpe ein nach restart"); } if ((getState('mqtt.0.Poolsteuerung.End_S.S'/*Poolsteuerung/End S/S*/).val === 1) && (getState('mqtt.0.Poolsteuerung.End_Rueck.S'/*Poolsteuerung/End Rueck/S*/).val === 1)){ setState("hm-rpc.0.NEQ0116143.1.STATE"/*Pool Pumpe.STATE*/, true); sendTo('telegram', "Pool Pumpe morgens EIN, Ventil Solar & Rücklauf offen"); } } }); }); // Pumpe morgens AUS const idAusMorgens = 'javascript.0.Pool.AusschaltzeitMorgens'; //als String "hh:mm" var t1 = getState(idAusMorgens).val.split(':'); var timer1 = schedule(t1[1] + ' ' + t1[0] + ' * * *', function() { if (getState("javascript.0.Pool.PumpeAktiv").val === true){ setState("hm-rpc.0.NEQ0116143.1.STATE"/*Pool Pumpe.STATE*/, false); sendTo('telegram', "Pool Pumpe morgens AUS"); log("Pumpe morgens aus nach restart"); } }); on(idAusMorgens, function(dp) { t1 = dp.state.val.split(':'); clearSchedule(timer1); timer1 = schedule(t1[1] + ' ' + t1[0] + ' * * *', function() { if (getState("javascript.0.Pool.PumpeAktiv").val === true){ setState("hm-rpc.0.NEQ0116143.1.STATE"/*Pool Pumpe.STATE*/, false); sendTo('telegram', "Pool Pumpe morgens AUS"); log("Pumpe morgens Aus über trigger"); } }); });
Leider ist bei meinen Scripten viel try and error dabei, aber irgendwann funktioniert es meistens, auch wenn es nicht der sauberste Code ist
-
@coyote Zu dem Punkt2 mit der Laufzeitsteuerung habe ich mal mit NodeRed und @schneidy76 und je nachdem wie lange die gelaufen ist mal etwas entsprechendes gemacht:
Auch wenn Du mit dem Tool vielleicht nicht vertraut bist, vielleicht gibt Dir die Logik manche Anregung.
Im Prinzip hat man einfach abends in Intervallen abgeprüft, ob noch eine offene Restlaufzeit vorhanden ist, die die Pumpe noch laufen muss. Ab wann hängt halt von der möglichen Maximallaufzeit ab. Also wenn 3h Abends - dann halt ab 21 Uhr prüfen etc.
-
@mickym danke dir, bin gerade am Testen, ob ich es nicht doch ganz einfach mit dem mytime Adapter hinbekomme.
Den kann ich, auf 6h setzen, nachdem die Pumpe morgens 3h gelaufen ist pausieren, falls die Pumpe dann tagsüber die restlichen 3h noch gelaufen ist, kann ich mit dem "end" DP von mytime mir einfach eine Sperre setzen, damit sie Abends nicht mehr einschaltet. Test läuft