Rotes Ausrufezeichen vor dem Script - mal ja - mal nein - Warum?

Hallo,

Habe vor einigen Tagen ein recht einfaches Script erstellt, was auch anscheindend funktioniert. Es soll die Umwälzpumpe dann einschalten, wenn die Temp. am Ofen größer 25 Grad wird. Und wieder abschalten, wenn die Temp. wieder darunter liegt. Dafür wird das Script minütlich ausgeführt.

<?

// Pumpe abhängig von der Temperatur schalten


$hm_id = 49244 /*[Heizung\Kaminofen\Kaminofen Pumpe]*/;
$soll_temp = GetValue(15581 /*[Heizung\Kaminofen\Schaltschwelle]*/);
$ist_temp = GetValue(18539 /*[Heizung\Kaminofen\Kaminofen Temperatur\Temperatur]*/);

// Zum Debuggen
// echo $soll_temp."
";
// echo $ist_temp;

$objekt = IPS_GetObject($IPS_SELF);

// wenn zu warm, wird die Pumpe eingeschaltet ...
if ($ist_temp > $soll_temp)
   {
   HM_WriteValueBoolean($hm_id, "STATE", true);
	IPS_LogMessage("Script ".$objekt['ObjectName'],"Pumpe - Kaminofen eingeschaltet!");
	}
// wenn wieder abgekühlt, geht die Pumpe wieder aus ...
else
   {
   HM_WriteValueBoolean($hm_id, "STATE", false);
	IPS_LogMessage("Script ".$objekt['ObjectName'],"Pumpe - Kaminofen ausgeschaltet!");
	}

?>

Und wenn ich die Sache in der Console beobachte, erscheint für mich nicht nachvollziehbar oft ein rotes Ausrufezeichen davor. Beim nächsten oder übernächsten Start durch das Ereignis geht es dann weg. Irgendwann erscheint es wieder. Das Script soll fehlerhaft sein. Führe ich es manuell aus habe ich nie eine Fehlermeldung.

Bevor ich die Sache scharf schalte (z.Z. noch Testbetrieb), möchte ich natürlich sichergehen, dass es auch zuverlässig funktioniert. Oder gibt es für mein „Vorhaben“ andere Vorschläge? Hatte auch mal das (http://www.ip-symcon.de/service/dokumentation/modulreferenz/heating-control/) angedacht.

Servus
will nicht kritisieren, aber du hast ja danach gefragt.

Also: Solche Sachen macht man eigentlich nicht mit periodisch gestarteten Scripten.

  • Viel besser ist das per Ereignissteuerung. d.h. ein Ereignis anlegen und das Script per „Bei Variableänderung“ loslaufen lassen.
    Das verhindert unnötiges minütliche Wiederholungen und blockieren des Funkkanals. -> warum soll denn zb. minütlich „AUSSCHALTEN“ gesendet werden, wenn eh schon aus ist.

  • Weiters solltest eine Hysterese einbauen. d.h. zwischen Ein/Ausschalten sollte noch eine Temperaturdifferenz sein.
    zb. über 40Grad „EIN“ unter 38Grad „AUS“ oder so. Das verhindert unnötiges oftmaliges Schalten.

gruß
bb

Kritik ist gut! Darum frage ich ja nach.

Deine Änderungen werde ich einpflegen. Ist das Aurufezeichen damit denn zu erklären?

Hast Du schon mal was mit dem Heating Control gemacht? Da gibt es ja auch eine Hystere?

Ich würde noch weiter gehen und zwei Ereignisse der Temperaturvariablen daran knüpfen. Nämlich einmal bei unterschreiten der Mindest- und bei überschreiten der Maximaltemperatur. Wie Bernhard es bereits angesprochen hat mit einer gewissen Hysterese. Und weiter solltest Du vorher den Status des HM-Aktors abfragen und nur bei abweichendem Zustand senden. Damit erfolgt kein unnötiger Schaltbefehl.

Rein Interesse halber - wenn Du vor den Schaltbefehl ein „@“ setzt - kommen die Ausrufezeichen dann immer noch?

Hab mal schnell was nachgebessert:

<?

// Pumpe abhängig von der Temperatur schalten


$hm_id = 49244 /*[Heizung\Kaminofen\Kaminofen Pumpe]*/;
$status = GetValueBoolean(IPS_GetVariableIDByName("STATE", $hm_id));
$ein_temp = GetValue(15581 /*[Heizung\Kaminofen\Schaltschwelle]*/);
$aus_temp = $ein_temp - GetValue(54668 /*[Heizung\Kaminofen\Hysterese]*/);
$ist_temp = GetValue(18539 /*[Heizung\Kaminofen\Kaminofen Temperatur\Temperatur]*/);

// Zum Debuggen
echo "Zustand Pumpe: " .$status . "
";
echo "Temp.Einschalten: " . $ein_temp . " Grad Celsius
";
echo "Temp.Ausschalten: " . $aus_temp . " Grad Celsius
";
echo "Ist-Temp.: " . $ist_temp . " Grad Celsius
";

$objekt = IPS_GetObject($IPS_SELF);

// wenn zu warm, wird die Pumpe eingeschaltet ...
if ($ist_temp > $ein_temp)
   {
   if (!$status)
      {
      HM_WriteValueBoolean($hm_id, "STATE", true);
		IPS_LogMessage("Script ".$objekt['ObjectName'],"Pumpe - Kaminofen eingeschaltet!");
		}
	}
	
// wenn wieder abgekühlt, geht die Pumpe wieder aus ...
if ($ist_temp < $aus_temp)
   {
   if ($status)
		{
		HM_WriteValueBoolean($hm_id, "STATE", false);
		IPS_LogMessage("Script ".$objekt['ObjectName'],"Pumpe - Kaminofen ausgeschaltet!");
		}
	}

?>