Nachlauftimer

Ich suche einen Codeschnipsel für einen Nachlauftimer. Was mache ich?
Über einen 1-Wire Digital out schalte ich eine Pumpe, die, bei Vorliegen von solar erwärmten Pufferwasser von über 60°C. dieses an einen Wärmetauscher pumpt. Die Sekundärseite des Wärmetauschers ist Poolwasser. Wenn die Temp unter 56°C. im Puffer fällt, schalte ich die Pumpe ab, damit der WT nicht meinen Puffer leersaugt und wir kalt duschen müssen :slight_smile:
Dem Poolcontroller signalisiere ich ebenfalls über einen 1W digital out, dass jetzt heisses Wasser kommt, und er das Pool-Wasser Ventil zum WT öffnen muss. Der Poolcontroller hat hierzu einen potentialfreien Eingang.

Zusätzlich gibt es noch einen Modus, der wie oben beschrieben funktioniert, jedoch der Gastherme die ebenfalls den Puffer heizt vorgaukelt, es wären 10K weniger im Puffer als tatsächlich vorhanden und so die Therme zum dauerfeuern bewegt. So kann ich den Pool auch über Gas heizen.

Das Skript sieht im Moment so aus und wird zyklisch ausgeführt:


?
date_default_timezone_set("Europe/Berlin");$puffer_oben_var = 31822 /*[Heizung\1-Wire\Pufferspeicher\Pufferspeicher oben\Temperatur]*/;$puffer_mitte_var = 45115 /*[Heizung\1-Wire\Pufferspeicher\Pufferspeicher Mitte\Temperatur]*/;$puffer_unten_var = 50638 /*[Heizung\1-Wire\Pufferspeicher\Pufferspeicher unten\Temperatur]*/;$status_var = 10873 /*[Pool\Wärmequellen\Zentralheizung\Anforderung Poolheizung]*/;$ow_aktor_pumpe_10k_var = 17308 /*[Heizung\1-Wire\Pumpensteuerung WT Pool\(DS2413) Dual Channel Addressable Switch]*/;$ow_aktor_signalisierung_an_poolcontroller_var = 15602 /*[Pool\Wärmequellen\1-Wire zum Poolcontroller Status Signalisierung ]*/;$wasser_temp_var = 21374 /*[Pool\Wassertemp 1-Wire Gartenhaus\Skimmer\Temperatur]*/;$puffersoll = 58; //Solltemperatur im oberen Pufferbereich wegen WW-Bereitung$hysterese = 2; //Schalthysterese$timestamp=time();$stunde = date("H",$timestamp);

// --------------------------------------------------------------------
$temp_puffer_oben = getvalue($puffer_oben_var);$temp_puffer_mitte = getvalue($puffer_mitte_var);$temp_puffer_unten = getvalue($puffer_unten_var);$modus = getvalueinteger ($status_var);$wassertemp = getvalue ($wasser_temp_var);
if ($stunde <9 OR $stunde > 18) {    echo "Abbruch, da ausserhalb der Pool Pumpenlaufzeit";    die;}
if ($wassertemp > 32) {    echo ('Heizung kann nicht aktiviert werden, da die Wassertemperatur über 32°C. erreicht hat');    $status = 0;    setvalue ($status_var, $status);    die;}echo $modus;switch ($modus) {
    case 0: //Poolheizung mittels Zentralheizung aus        OW_SetPin ($ow_aktor_pumpe_10k_var,0,false); // 10k Pufferfühler Absenkung aus = Realtemperatur        OW_SetPin ($ow_aktor_pumpe_10k_var,1,false); // Pumpengruppe zum Pool Wärmetauscher aus        OW_SetPin ($ow_aktor_signalisierung_an_poolcontroller_var,0,false); // Poolcontroller signalisieren, das Belimoventil zum Wärmetauscher zu schliessen    break;
    case 1; // Solar und Gas, alle Wärme in den Pool, aber 55° im Puffer vorhalten        OW_SetPin ($ow_aktor_pumpe_10k_var,0,true); // 10k Pufferfühler Absenkung an = Gastherme eine 10K geringere Puffertemp als Realtemperatur vorgauckeln, damit sie durchgängig feuert          if ($temp_puffer_oben >= ($puffersoll + $hysterese)) {                OW_SetPin ($ow_aktor_signalisierung_an_poolcontroller_var,0,true); // Poolcontroller signalisieren, das Belimoventil zum Wärmetauscher zu öffnen                OW_SetPin ($ow_aktor_pumpe_10k_var,1,true); // Pumpengruppe zum Pool Wärmetauscher an        }        elseif ($temp_puffer_oben <= $puffersoll) {            OW_SetPin ($ow_aktor_pumpe_10k_var,0,true); // 10k Pufferfühler Absenkung anlassen, damit weiter mit Gas geheizt wird              OW_SetPin ($ow_aktor_pumpe_10k_var,1,false); // Pumpengruppe zum Pool Wärmetauscher aus, damit die 55!C im Puffer erhalten bleiben.            OW_SetPin ($ow_aktor_signalisierung_an_poolcontroller_var,0,false); // Poolcontroller signalisieren, das Belimoventil zum Wärmetauscher zu schliessen        }    break;        case 2: // Nur bei solarem Überschuss heizen, aber 55° im Puffer vorhalten        if ($temp_puffer_oben >= ($puffersoll + $hysterese)) {         OW_SetPin ($ow_aktor_signalisierung_an_poolcontroller_var,0,true); // Poolcontroller signalisieren, das Belimoventil zum Wärmetauscher zu öffnen            OW_SetPin ($ow_aktor_pumpe_10k_var,0,false); // 10k Pufferfühler Absenkung aus = Realtemperatur            OW_SetPin ($ow_aktor_pumpe_10k_var,1,true); // Pumpengruppe zum Pool Wärmetauscher an        }        elseif ($temp_puffer_oben <= $puffersoll) {           OW_SetPin ($ow_aktor_pumpe_10k_var,0,false); // 10k Pufferfühler Absenkung aus = Realtemperatur            OW_SetPin ($ow_aktor_pumpe_10k_var,1,false); // Pumpengruppe zum Pool Wärmetauscher aus            OW_SetPin ($ow_aktor_signalisierung_an_poolcontroller_var,0,false); // Poolcontroller signalisieren, das Belimoventil zum Wärmetauscher zu schliessen        }    break;
}?>


Was ich noch suche ist ein passender Codeschnipsel, welcher es mir ermöglicht dem Pool-Controller erst 5 Minuten nach dem Aschalten der Pufferwasserpumpe zu signalisieren, um das Poolventil zu schliessen. So kann ich zum einen noch die Restwärme im WT ernten, zum anderen werden die Kunststoff-Fittinge der Pool-Seite dann gekühlt.

Kann mir jemand da vielleicht helfen?

Danke vorab.

wupperi

EDIT: Das Forum plugin mag case-break wohl nicht. Das Skript ist so natürlich blöd zu lesen, aber in notepad++ (Oder ips) wird es richtig dargestellt. Ich hänge das Skript mal als txt an den Post.

pool-controll.txt (3.86 KB)

Vielleicht hilft dir das aus der „wie kann ich …“ Ecke weiter (erstes Beispiel) - sofern ich das Problem richtig verstanden habe … :o

LG Tom

Nicht ganz. Das Beispiel ruft ja das auslösende Skript komplett wieder auf.
Was ich brauche ist ja, dass mein Skript, welches bspw alle 30s sowieso durchläuft, bei einem bestimmten Zustand (Pumpe vom Pufferwasser zum Poolwärmetauscher wurde gerade ausgeschaltet), einen bestimmten 1Wire Pin noch 300s geschlossen hält und erst dann öffnet.

Also dieses Beispiel ruft zwar wieder das Script auf es wird aber nur der Codeteil im ersten If ausgeführt. Du müsstest also im ersten Teil deinen Code für „Pumpe aus“ einfügen. Dein jetziges Script in den zweiten Teil. Der wird immer nur ausgeführt wenn das Script NICHT durch einen Timer ausgeführt wurde.

if($_IPS['SENDER'] == "TimerEvent")
{
    //Befehl für Pumpe aus
 
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
} else {
    //Der Inhalt aus deinem Script
 
    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}

Stephan

Soweit so klar. Aber mein Skript wird ja zyklisch alle 30s sowieso durch einen manuell erstellten Timer ausgeführt.
Damit würde doch die 1. Bedingung im if…then sowieso immer greifen.

Ein Sender=WF oder execute gibt es nicht, bei diesem Skript.

… nur so als Gedankenanregung: dieses Skript-Beispiel unterscheidet zwischen ScriptTimer und deinem „manuell erstellten Timer“.

MST