andere Möglichkeit für IPS_Sleep

Du kannst es mal mit Semaphore probieren. Oder einfach im Script eine Variable setzen true/false und gegenseitig von den Scripts abfragen. Wenn das eine läuft setzt es die Variable true und am Ende wieder false. Bei true verriegelt es dann da andere Script.

Würde dann in etwa so aussehen.

<?
switch($IPS_SENDER)
{
    case "Execute": // im Sript ausführen. Simuliert Button im Webfront
   break;
   case "TimerEvent":
   if($IPS_EVENT == 58305 /*[Test\2Timer\]*/) // ID des Scripttimer
   {
      TTS_Speak(28627 /*[Sprachausgabe\Text To Speech]*/, "Ausgeschaltet" , true);
      IPS_LogMessage($IPS_SELF, "Aus"); // Ausgabe in Meldungen
      SetValue(12345, false);
       IPS_SetScriptTimer($IPS_SELF, 0);
       return;
    }
   break;
}

if(GetValue(12345))
{
    return;
}
else
{
    TTS_Speak(28627 /*[Sprachausgabe\Text To Speech]*/, "Eingeschaltet" , true);
    IPS_LogMessage($IPS_SELF, "Ein"); // Ausgabe in Meldungen
    SetValue(12345, true);
    IPS_SetScriptTimer($IPS_SELF, 10);
}
?>

…wäre das so richtig?
12345, muß da die ID vom Script "Rollladen runter" rein?

Script „Rollladen rauf“:


<?
switch($IPS_SENDER)
{
   case "WebFront":
   SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, true);
   break;
   case "TimerEvent":
   if($IPS_EVENT == 46784 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf\Rollladen alle rauf\]*/ ) // ID des Scripttimer
   {
       ModBus_WriteCoil(11682 /*[Wago\DigitalOut 2DO 230V\Relais 1.1]*/, false); //Gerät ausschalten
       ModBus_WriteCoil(27098 /*[Wago\DigitalOut 2DO 230V\Relais 2.1]*/, false); //Gerät ausschalten
       SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, false);
		 SetValue(12345, false); //ID vom Script Rollladen runter ????
		 IPS_SetScriptTimer($IPS_SELF, 0);
       return;
    }
   break;
}
if(GetValue(12345)) //ID vom Script Rollladen runter ????
{
    return;
}
SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, true);
ModBus_WriteCoil(11682 /*[Wago\DigitalOut 2DO 230V\Relais 1.1]*/, true); //Gerät einschalten
ModBus_WriteCoil(27098 /*[Wago\DigitalOut 2DO 230V\Relais 2.1]*/, true); //Gerät einschalten

SetValue(12345, true); //ID vom Script Rollladen runter ????
IPS_SetScriptTimer($IPS_SELF, 70);
?>

12345 ist die ID deiner angelegten Boolvariable. Diese wird in beiden Scripts verwendet.

Waren denn die Einträge richtig, außer die, der ID?

…also das Boolean vom eigenen oder vom anderen Script:

Rollladen rauf =

SetValue(59390, false);
if(GetValue(59390)) //ID von Boolean Rollladen runter ????
SetValue(59390, true);

Es gibt nur eine Variable, diese ist in beiden Scripts die gleiche. Wenn diese true ist, kann das andere Script nichts ausführen weil das andere ja schon läuft.

<?
switch($IPS_SENDER)
{
   case "WebFront":
   SetValueBoolean(13427 /*[Objekt #13427 existiert nicht]*/, true);
   break;
   case "TimerEvent":
   if($IPS_EVENT == 46784 /*[Objekt #46784 existiert nicht]*/ ) // ID des Scripttimer
   {
       ModBus_WriteCoil(11682 /*[Objekt #11682 existiert nicht]*/, false); //Gerät ausschalten
       ModBus_WriteCoil(27098 /*[Objekt #27098 existiert nicht]*/, false); //Gerät ausschalten
       SetValueBoolean(13427 /*[Objekt #13427 existiert nicht]*/, false); // Sript freigeben
         SetValue(12345 /*[Objekt #12345 existiert nicht]*/, false); //ID vom Script Rollladen runter ????
         IPS_SetScriptTimer($IPS_SELF, 0);
       return;
    }
   break;
}
if(GetValue(13427 /*[Objekt #12345 existiert nicht]*/)) //ID Variable Script gesperrt ????
{
    return;
}
else
{
    SetValueBoolean(13427 /*[Objekt #13427 existiert nicht]*/, true); // Script gesperrt
    ModBus_WriteCoil(11682 /*[Objekt #11682 existiert nicht]*/, true); //Gerät einschalten
    ModBus_WriteCoil(27098 /*[Objekt #27098 existiert nicht]*/, true); //Gerät einschalten
    IPS_SetScriptTimer($IPS_SELF, 70);
}
?>

Wenn Du damit nicht zurecht kommst, die nächste Trockenübung.

Leg dir eine Boolvariable mit Namen Script gesperrt an. Diese führst Du dann mal von Hand aus von true auf false und beobachte was passiert wenn Du das Script ausführst.

<?
switch($IPS_SENDER)
{
    case "Execute": // im Sript ausführen. Simuliert Button im Webfront
   break;
   case "TimerEvent":
   if($IPS_EVENT == 58305 /*[Test\2Timer\]*/) // ID des Scripttimer
   {
      TTS_Speak(28627 /*[Sprachausgabe\Text To Speech]*/, "Ausgeschaltet" , true);
      IPS_LogMessage($IPS_SELF, "Aus"); // Ausgabe in Meldungen
      SetValue(33476 /*[Test\2Timer\Script gesperrt]*/, false); // Script freigeben
       IPS_SetScriptTimer($IPS_SELF, 0);
       return;
    }
   break;
}

if(GetValue(33476 /*[Test\2Timer\Script gesperrt]*/)) // Script Freigabe prüfen, wenn true verlassen
{
   IPS_LogMessage($IPS_SELF, "Script ist gesperrt");
    return;
}
else // sonst ausführen
{
    TTS_Speak(28627 /*[Sprachausgabe\Text To Speech]*/, "Eingeschaltet" , true);
    IPS_LogMessage($IPS_SELF, "Ein"); // Ausgabe in Meldungen
    SetValue(33476 /*[Test\2Timer\Script gesperrt]*/, true); // Script sperren
    IPS_SetScriptTimer($IPS_SELF, 20);
}
?>

…so, letzter Versuch.
Ist das so richtig?

Rollladen rauf:


<?
switch($IPS_SENDER)
{
   case "WebFront":
   break;
   case "TimerEvent":
   if($IPS_EVENT == 46784 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf\Rollladen alle rauf\]*/ ) // ID des Scripttimer
   {
      ModBus_WriteCoil(11682 /*[Wago\DigitalOut 2DO 230V\Relais 1.1]*/, false); //Gerät ausschalten
      ModBus_WriteCoil(27098 /*[Wago\DigitalOut 2DO 230V\Relais 2.1]*/, false); //Gerät ausschalten
      SetValue(13427 , false); // Script freigeben
      IPS_SetScriptTimer($IPS_SELF, 0);
      return;
    }
   break;
}
if(GetValue(13427)) // Script Freigabe prüfen, wenn true verlassen
    {
   IPS_LogMessage($IPS_SELF, "Script ist gesperrt");
   return;
    }
else // sonst ausführen
    {
        SetValue(13427 , true); // Script sperren
        ModBus_WriteCoil(11682 /*[Wago\DigitalOut 2DO 230V\Relais 1.1]*/, true); //Gerät einschalten
        ModBus_WriteCoil(27098 /*[Wago\DigitalOut 2DO 230V\Relais 2.1]*/, true); //Gerät einschalten
        IPS_SetScriptTimer($IPS_SELF, 70);
    }
?>

Rollladen runter:


<?
switch($IPS_SENDER)
{
   case "WebFront":
   break;
   case "TimerEvent":
   if($IPS_EVENT == 10909 /*[Rollladen\Rollladen Wohnzimmer\Rollladen runter\Rollladen alle runter\]*/ ) // ID des Scripttimer
   {
      ModBus_WriteCoil(26881 /*[Wago\DigitalOut 2DO 230V\Relais 1.2]*/, false); //Gerät ausschalten
      ModBus_WriteCoil(13194 /*[Wago\DigitalOut 2DO 230V\Relais 2.2]*/, false); //Gerät ausschalten
      SetValue(13427, false); // Script freigeben
        IPS_SetScriptTimer($IPS_SELF, 0);
      return;
    }
   break;
}
if(GetValue(13427)) // Script Freigabe prüfen, wenn true verlassen
    {
   IPS_LogMessage($IPS_SELF, "Script ist gesperrt");
   return;
    }
else // sonst ausführen
    {
        SetValue(13427, true); // Script sperren
        ModBus_WriteCoil(26881 /*[Wago\DigitalOut 2DO 230V\Relais 1.2]*/, true); //Gerät einschalten
        ModBus_WriteCoil(13194 /*[Wago\DigitalOut 2DO 230V\Relais 2.2]*/, true); //Gerät einschalten
        IPS_SetScriptTimer($IPS_SELF, 70);
    }
?>

Nö, ich änder dir das jetzt in deinen oben geposteten Scripts ab.

Hab sie angepasst.

Ansonsten komm mal in den Chat!

…na fast.
Wenn ich die Rollläden runter fahre dann wechselt der Button für das „Rollo hoch“ auf an (grün).
Button „Rollo runter“ verändert sich nicht.

Egal wer fährt, sind gegeneinander gesperrt :slight_smile:

Das kann normal nicht sein. Wenn kein Script läuft, muss die Variable auf false stehen, wenn ein Script läuft muss sie auf true stehen.

Egal wer fährt, sind gegeneinander gesperrt

Ahh, OK. Habs dann falsch verstanden.

Beim Rest hast Du wohl was vertauscht.

…also,
in beiden Skripten wird die Variable Boolean mit der ID 13427 angesprochen. Diese ist für Rollladen hoch vorgesehen, siehe Anhang.
Wenn ich Rollladen „runter“ anklicke, ändert sich natürlich der Button Rollladen hoch.

Du raubst mir noch meine letzten Haare. :smiley:

ID 13427 ist die Sperrvariable und hat nix mit hoch und runter zutun!

Blend die Variable aus, die hat nix im Webfront zu suchen.

…ich glaube, viel mehr habe ich auch nicht. :rolleyes:

Das war der entscheidende Hinweis :eek:,
noch eine Variable „Boolean“–Name „Gesperrt“ erstellt, diese ID 56743 im Script zum sperren verwendet, folgende Zeilen wieder eingefügt…


SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, false); //Button umschalten
.
.
.
SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, true); //Button umschalten

Voila, es funktioniert! :slight_smile:

Ein ham wa noch:
Lassen sich die Button im iFront auch sperren?


<?
switch($IPS_SENDER)
{
   case "WebFront":
   break;
   case "TimerEvent":
   if($IPS_EVENT == 46784 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf\Rollladen alle rauf\]*/ ) // ID des Scripttimer
   {
      ModBus_WriteCoil(11682 /*[Wago\DigitalOut 2DO 230V\Relais 1.1]*/, false); //Gerät ausschalten
      ModBus_WriteCoil(27098 /*[Wago\DigitalOut 2DO 230V\Relais 2.1]*/, false); //Gerät ausschalten
		SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, false); //Button umschalten
		SetValue(56743 /*[Rollladen\Rollladen Wohnzimmer\Gesperrt]*/ , false); // Script freigeben
      IPS_SetScriptTimer($IPS_SELF, 0);
      return;
    }
   break;
}
if(GetValue(56743 /*[Rollladen\Rollladen Wohnzimmer\Gesperrt]*/)) // Script Freigabe prüfen, wenn true verlassen
    {
   IPS_LogMessage($IPS_SELF, "Script ist gesperrt");
   return;
    }
else // sonst ausführen
    {
      SetValue(56743 /*[Rollladen\Rollladen Wohnzimmer\Gesperrt]*/ , true); // Script sperren
      ModBus_WriteCoil(11682 /*[Wago\DigitalOut 2DO 230V\Relais 1.1]*/, true); //Gerät einschalten
      ModBus_WriteCoil(27098 /*[Wago\DigitalOut 2DO 230V\Relais 2.1]*/, true); //Gerät einschalten
      SetValueBoolean(13427 /*[Rollladen\Rollladen Wohnzimmer\Rollladen rauf]*/, true); //Button umschalten
		IPS_SetScriptTimer($IPS_SELF, 70);
    }
?>

Lassen sich die Button im iFront auch sperren

Wieso sollten sie. Du sperrst ja im Webfront auch keine Button. Wenn ein Script läuft kannst Du drücken was Du willst, es geht nicht.

Wenn Du die Funktionsweise des Script immer noch nicht verstanden hast, schlaf erst mal drüber. :wink: