Timer mit Homematic

Hallo wer kann, helfen?
Ich möchte einen HM Aktor für 20 sec starten, wenn $erg1 = 0 aber nur nur wenn $erg3 = 1
nach dem Ende soll eine Wartezeit von x Sekunden eingehalten werden.
Starten des Aktors soll solange wiederhot werden bis $erg2 = 1.

für jede Hilfe dankbar.


$time = 20; // Einschaltdauer in Sekunden
$id_variable = 51132 /*Saugturbine]*/;

$id_aktor3 = 37917 /*[HomeMatic\Aktor\Schalterdose\HM Schalterdose 3_Pelletsauger]*/;
$erg1 = GetValueFloat(11304 /*[Heizungssteuerung\UVR1611 - 2\D8 LagPel 1/3]*/);
$erg2 = GetValueFloat(30325 /*[Heizungssteuerung\UVR1611 - 2\D7 LagPel (1/2)]*/);
$erg3 = GetValueFloat(11704 /*[Heizungssteuerung\UVR1611 - 2\D6 PelletLageraußen]*/);


if($_IPS['SENDER'] == "TimerEvent"){
	if ($erg2 == 0){
                echo "Lager 2 leer";
		IPS_SetScriptTimer($_IPS['SELF'], 0);

	  	//HM_WriteValueBoolean($id_aktor2, "STATE" , false);
  		HM_WriteValueBoolean($id_aktor3, "STATE" , false);
	  	SetValueBoolean($id_variable,true);
	  	echo "Aus-Schalten";
       }
}

if ($_IPS['SENDER'] <> "TimerEvent"){
	echo "TimerEvent";

	if (($erg1 == 0) and ($erg3 == 1)){
		echo "Außenlager voll";
		IPS_SetScriptTimer($_IPS['SELF'], $time); 	// X sec
		echo "IPS_SetScriptTimer wurde gesetzt";
        	//HM_WriteValueBoolean($id_aktor2, "STATE" , true);
	  	HM_WriteValueBoolean($id_aktor3, "STATE" , true);
	  	SetValueBoolean($id_variable,true);
		echo "Ein-Schalten";
   	}
}

?>

Habe ich einen Denkfehler oder siehst du den Wald vor lauter Bäumen nicht? :smiley:

Du rufst das Skript auf und wenn $erg1 == 0 und $erg3 == 1, dann Aufruf durch Timer alle 20 Sekunden, also frag doch einfach im Timer-Aufruf ab und stoppe den Timer wieder, wenn erg2 == 1 ist

if($IPS_SENDER == "TimerEvent") {
    if ($erg2 == 1){
      IPS_SetScriptTimer($IPS_SELF, 0); 
	 }
}

Weil der Timer ruft ja so lange alle 20 Sekunden das Skript auf, bis du den Timer wieder auf 0 setzt und damit deaktivierst…

Zusätzlich kannst du es automatisch aufrufen lassen, wenn du ein Ereignis auf Variablenänderung anlegst beim Skript. Aber da kann ich nichts genauer sage, denn ich verstehe deinen Aufbau noch nicht so ganz :smiley:

Grüße,
Chris

Ich finde einfach den Dreh nicht mit Timer

Den Timer hast du doch schon eingebaut?! Nur glaube nicht ganz korrekt geschrieben. So sieht es bei mir in den Skripten aus und funktioniert:

IPS_SetScriptTimer($IPS_SELF, 20); // Startet das Skript per Timer alle 20 Sekunden

IPS_SetScriptTimer($IPS_SELF, 0); // Schaltet den Timer ab

// Führt diesen Skriptteil nur aus, wenn das Skript durch einen Timer gestartet/aufgerufen wurde
if($IPS_SENDER == „TimerEvent“) {
echo „Skript-Start durch Timer“;
}

Denke das Problem war rein die falsche Schreibweise bei dir?! Bitte genau so schreiben, wie ich es geschrieben habe.

Grüße,
Chris

der Timer soll nicht das Script,sondern den Aktor schalten

die on_time funktion geht bei einigen hm aktoren nicht, dehalb der timerEvent.
aber ich mache was falsch, ich weis nicht wo ?

Der Timer soll den Aktor schalten…kein Problem :slight_smile: Einfach durch den Timer ein Skript aufrufen und in dem Skript den Aktor schalten lassen. Ist doch dein Ziel, oder?

if($IPS_SENDER == "TimerEvent") {
    if ($erg2 == 1){
      IPS_SetScriptTimer($IPS_SELF, 0); 
      HM_WriteValueBoolean($id_aktor3, "STATE" , true);
     }
}  

Damit wird im Skript, beim Aufruf durch den Timer abgefragt ob $erg2 == 1 ist, wenn ja, dann wird der Timer angehalten und der Aktor auf TRUE geschaltet.

Musst du natürlich auf deine Sachen anpassen, steig bei deinem Aufbau noch nicht so ganz durch, aber grundsätzlich funktioniert es so, wie ich es geschrieben habe.

Grüße,
Chris

Danke Chris für deine Mühe

Kommst du damit jetzt zurecht? Wenn dir noch was unklar ist oder du noch irgendwo hängst, dann frag ruhig!
Am besten aber dann vlt noch etwas genauer verdeutlichen wie wo was du genau vor hast, dann kann man dir leichter helfen. Ist immer recht schwer sich in andere Projekte reinzudenken…deshalb - desto mehr Information du rausrückst, desto leichter/besser :slight_smile:

Viel Erfolg und Grüße,
Chris

Leider nein, es liegt wohl daran, dass mein lan-apater und ip s zu lange zeit benötigen, zum austauschen
da sind sekunden schnell weg, und mein Aktor zu langsam.
Rolf

Du meinst zwischen Wert setzen und Wert refreshen von einem Homematic Aktor und abfragen? Kann dir leider nach wie vor nicht folgen… Sonst könnte ich dir leichter helfen…

Du könntest damit arbeiten:
IPS_Sleep(3000); // Skript pausiert/wartet für 3 Sekunden

Oder du erhöhst die Zeit vom Timer von 20 Sekunden auf 30 Sekunden oder verkürzt sie oder was auch immer du vor hast?!

Grüße,
Chris

Skript für dein Pellet Lager:

<? 
$time = 17; // Einschaltdauer in Sekunden  // hier kannst du evtl. noch auf 18 erhöhen, musst du testen, damit deine maximalen 20 Sek. nicht überschritten werden 
$SaugturbineStatus = 51132 /*Saugturbine]*/;  // Boolean Variable 
$HMaktorPelletsauger = 37917 /*[HomeMatic\Aktor\Schalterdose\HM Schalterdose 3_Pelletsauger]*/; 
$erg1 = GetValue(11304 /*[Heizungssteuerung\UVR1611 - 2\D8 LagPel 1/3]*/);  // Boolean Variable 
$erg2 = GetValue(30325 /*[Heizungssteuerung\UVR1611 - 2\D7 LagPel (1/2)]*/);  // Boolean Variable 
$erg3 = GetValue(11704 /*[Heizungssteuerung\UVR1611 - 2\D6 PelletLageraußen]*/);  // Boolean Variable 


if ($erg2 == true) {
	IPS_SetScriptTimer($IPS_SELF, 0);  // Timer abschalten  
	HM_WriteValueBoolean($HMaktorPelletsauger, "STATE" , false);   // Dein Pelletsauger wieder abgeschaltet
  SetValue($SaugturbineStatus, false);  // Status für Turbinenaktivität wird auf false (AUS) gesetzt 
}


if (($erg1 == false) AND ($erg3 == true)) {  // wenn $erg1 GLEICH false und $erg3 GLEICH true, dann wird der Timer auf aktuell 17 Sek. gestellt und der Pelletsauger eingestellt 
    IPS_SetScriptTimer($IPS_SELF, $time); 
    HM_WriteValueBoolean($HMaktorPelletsauger, "STATE" , true);   // Dein Pelletsauger wird eingeschaltet 
    SetValue($SaugturbineStatus, true);  // Status für Turbinenaktivität wird auf TRUE gesetzt 
} 

// der folgende if-Teil wird nur aufgerufen, wenn das Skript per Timer gestartet wurde (also nach den eben festgelegten 17 Sekunden) 
if($IPS_SENDER == "TimerEvent") { 
  HM_WriteValueBoolean($HMaktorPelletsauger, "STATE" , false);   // Dein Pelletsauger wird erstmal ausgeschaltet (ist jetzt knapp 20 Sek. gelaufen - musst du Live testen) 
  SetValue($SaugturbineStatus, false);  // Status für Turbinenaktivität wird auf FALSE gesetzt 
  if ($erg2 == false){    // wenn $erg2 GLEICH false ist, dann wird der Timer aktiv gelassen, 5 Sek. gewartet, Sauger wieder eigneschaltet und dann das Skript erneut aufgerufen nach 17 Sek.
    IPS_Sleep(5000);  // 5 Sekunden das Skript pausieren lassen 
    HM_WriteValueBoolean($HMaktorPelletsauger, "STATE" , true);   // Dein Pelletsauger wieder eingeschalten (bis in 17 Sekunden das Skript wieder aufgerufen wird und der Sauger erstmal wieder abgeschaltet wird) 
    SetValue($SaugturbineStatus, true);  // Status für Turbinenaktivität wird auf TRUE gesetzt 
  } 
}   

?>

Und diesem Skript fügst du jetzt noch ein AUSGELÖSTES Ereignis hinzu (Im Skript „Ereignis hinzufügen“ und dann „ausgelöstes Ereignis“, dann die zu überwachende Variable wählen und auf Wertänderung oder einen bestimmten Wert oder was zu benötigst. Zum Beispiel wenn Sensor X den Wert false hat oder irgendwie sowas. Dann wird das Skript immer aufgerufen, wenn dein Sensor meldet „Lager zu leer“. Und natürlich eine Überwachung auf die Variable $erg2, damit gestoppt werden kann.
Dann wird das Skript immer wieder durch den Timer gestartet (alle 17 Sekunden), bis $erg2 GLEICH true und dann wird so lange nichts gemacht, bis das auslösende Ereignis das Skript wieder aufruft und die Bedingung „if (($erg1 == false) AND ($erg3 == true))“ erfüllt wurde, dann beginnt der Ablauf erneut…

Ich hoffe damit kannst du jetzt was anfangen :slight_smile:

Grüße,
Chris

PS: Du solltest dich dringend mal in die Grundlagen von PHP und IPS einlesen, ist nicht so schwer, habe es selbst auch geschafft :smiley:

PPS: Hier gibst die IP Symcon Befehlsreferenz, sehr wichtig :slight_smile: >> http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/

Skript nochmal geändert (Abfrage zur $erg2 == true anders eingebaut)!!! Damit wird dann sofort gestoppt wenn die Bedingung erfüllt ist und nicht erst nach bis zu 20 Sek.

Keine Ahnung, ob du das brauchst, aber jetzt ist es drinne, suchs dir aus :slight_smile: