Script mit eingebauter VERZÖGERUNG

Hallo Leuts,

ich fummel nun schon mehrere Tage rum. Hab einiges gelesen und nicht gerafft:o
Nun wurde mir beim Treffen sogar geholfen, aber leider nicht am laufenden System. Es funktioniert leider auch mit der Hilfe nicht. HIEEEELFEEE…

Also mein Ziel ist es das der Wagoport, wenn er aus war, eingeschaltet wird, und nach 18 Stunden wieder aus.
Ich habe bei der Hilfe auch tatsächlich etwas gelernt - es ist nicht egal wie das Script gestartet wird. Bei mir zur Zeit nur durch ein anderes Script das IR Signale auswertet. Später soll dann auch auf dem Touch eine Auslösung erfolgen.
Wenn der Wagoport an war soll er gleich wieder aus gehen.

Meine Erfolge waren viele Fehlermeldungen und auch ein Erfolgserlebnis - das Script wurde alle 10sec. gestartet (10sec. als Testzeit statt 18h)

(der obere Teil des Scrips ist dazu da das es nicht mehrfach aufgerufen wird wenn man den Finger nicht schnell genug von der Fernbedienung nimmt und ist NICHT von mir, also nicht meine PHP Erfahrung darauf rückschließen)

<?

$t68 = IPS_GetVariable(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/);
          if((time()-$t68['VariableUpdated'])>1) setvalue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/, false);
          if(getvalue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/)) return; // Mehrfaches Triggern in kurzer Zeit verhindern
          SetValue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/, true);

$ZahnbuersteDU = getValueBoolean(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/);  //hole Zustand von Variable - ist gerade an oder aus?

 if ($ZahnbuersteDU == false)
{
	ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,true);
	setvalue(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/,true);
}

if ($ZahnbuersteDU == true)
{
	ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,false);
	setvalue(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/,false);
}

?>

Hier das Script in dem die Hilfe gezeigt und erklärt wurde… …aber leider nicht geht:(

<?

$t64 = IPS_GetVariable(30984 /*[Sonstige Aktoren\64 Leinwand An&Hoch\IRpauseLeinwandHoch]*/);
          if((time()-$t64['VariableUpdated'])>1) setvalue(30984 /*[Sonstige Aktoren\64 Leinwand An&Hoch\IRpauseLeinwandHoch]*/, false);
          if(getvalue(30984 /*[Sonstige Aktoren\64 Leinwand An&Hoch\IRpauseLeinwandHoch]*/)) return; // Mehrfaches Triggern in kurzer Zeit verhindern
          SetValue(30984 /*[Sonstige Aktoren\64 Leinwand An&Hoch\IRpauseLeinwandHoch]*/, true);

if ($IPS_SENDER == "RunScript") {

	//COMPort_SendText(20531 /*[Serial Port 17 / 3-1..4a+b]*/ , "\xffId\10\xfe");
	ModBus_WriteCoil(41500 /*[WagoPorts schreiben\Port63 Leinwand (230V/Stop)]*/,true); //Strom AN
	IPS_Sleep (2000);
	ModBus_WriteCoil(16231 /*[WagoPorts schreiben\Port64 Leinwand AUF]*/,true); //Taste hoch drcken
	IPS_Sleep (500); // warte
	ModBus_WriteCoil(16231 /*[WagoPorts schreiben\Port64 Leinwand AUF]*/,false);  //Taste hoch loslassen
	
	IPS_SetScriptTimer($IPS_SELF, 1*60); // Zeit in Sekunden (als Formel)

} else {

   ModBus_WriteCoil(41500 /*[WagoPorts schreiben\Port63 Leinwand (230V/Stop)]*/,false); //Strom AUS
	IPS_SetScriptTimer($IPS_SELF, 0);
}
?>

Wenn jemand sich findet für eine Hilfe, bitte nach Art „PHP für Dummis“ erklären. Damit es nicht nur drinn steht, sondern ich nun hoffentlich auch mal raffe:rolleyes:

Gruß und Danke

Jan

Moin Jan,
deine ModBus Kommandos kann ich nicht so richtig nachvollziehen, aber das Script funktioniert so wie in Sarkwitz besprochen.

Als Beispiel mal etwas reduziert mit Meldungsausgabe:

Script zum Testen mit Execute starten, das wäre dann dein IR Script

<?
IPS_RunScript(ID vom anderen Script!);
?>

und dieses wird ausgeführt und gibt die Meldungen aus:

<?
$debug=true;

if ($IPS_SENDER == "RunScript") {
	if ($debug)
		IPS_LogMessage(IPS_GetName($IPS_SELF), "Aufruf durch " . $IPS_SENDER . ", Timer starten");

// hier müssen deine EINschaltkommandos stehen

    IPS_SetScriptTimer($IPS_SELF, 1*60); // Zeit in Sekunden

} else {

	if ($debug)
		IPS_LogMessage(IPS_GetName($IPS_SELF), "Aufruf durch " . $IPS_SENDER . ", Timer auf 0 setzen");

// und hier müssen deine AUSschaltkommandos stehen


   IPS_SetScriptTimer($IPS_SELF, 0);
}
?>

Und für die Zahnbürstenfrage passt doch fast alles. Oder willst du die Ladung auch per IR Script aufrufen?

Ich würde wie folgt schreiben:

<?

$t68 = IPS_GetVariable(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/);
          if((time()-$t68['VariableUpdated'])>1) setvalue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/, false);
          if(getvalue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/)) return; // Mehrfaches Triggern in kurzer Zeit verhindern
          SetValue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/, true);

$ZahnbuersteDU = getValueBoolean(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/);  //hole Zustand von Variable - ist gerade an oder aus?

if ($ZahnbuersteDU == false) {
    ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,true);
    setvalue(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/,true);
} else {
    ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,false);
    setvalue(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/,false);
}

?>

und ein zyklisches Ereignisanlegen, das alle 18 Stunden aufgerufen wird. Dann wechselt der Zustand alle 18 Stunden ;).

Hallo Ralf,

vielen Dank für die Hilfe…

ich habe es ausprobiert und es geht:)
Nun hab ich es noch etwas erweitert und kann nun durch nochmaliges Drücken vorzeitig abbrechen (Testzeit steht auf 10sec.)

nunsieht es so aus:

<?
$t68 = IPS_GetVariable(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/);
          if((time()-$t68['VariableUpdated'])>1) setvalue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/, false);
          if(getvalue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/)) return; // Mehrfaches Triggern in kurzer Zeit verhindern
          SetValue(11812 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\IRpauseZahnbDU]*/, true);

$debug=true;

if ($IPS_SENDER == "RunScript") {
    if ($debug)
        IPS_LogMessage(IPS_GetName($IPS_SELF), "Aufruf durch " . $IPS_SENDER . ", Timer starten");
        
 // von hier müssen deine EINschaltkommandos stehen
$ZahnbuersteDU = getValueBoolean(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/);  //hole Zustand von Variable - ist gerade an oder aus?

if ($ZahnbuersteDU == false) {
    ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,true);
    setvalue(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/,true);
} else {
    ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,false);
    setvalue(39147 /*[Sonstige Aktoren\68 Lader - Zahnbürste DU\ZahnbDU]*/,false);
}
 // bis hier müssen deine EINschaltkommandos stehen

    IPS_SetScriptTimer($IPS_SELF, 1*10); // Zeit in Sekunden

} else {

    if ($debug)
        IPS_LogMessage(IPS_GetName($IPS_SELF), "Aufruf durch " . $IPS_SENDER . ", Timer auf 0 setzen");


ModBus_WriteCoil(48004 /*[WagoPorts schreiben\Port68 Lader-ZahnbürsteDU]*/,false); // und hier müssen deine AUSschaltkommandos stehen


   IPS_SetScriptTimer($IPS_SELF, 0);
}
?>

Zum Befehl für die Wago: http://www.ip-symcon.de/forum/f52/neuer-befehl-fuer-wago-14143/

Gruß Jan

:slight_smile: