Mehrere Befehle für einen gewissen Zeitraum nach einander ausführen (Sprinklerprogram

Hallo Zusammen,

nach dem ich im letzten Jahr einfach nicht die Zeit gefunden habe meine Sprinkler so zu Programmieren, wie ich es mir vorstelle und ich mir eine Umgehung gebastelt habe (Ich habe einfach für die 6 Sprinklerstränge Zeitschaltungen gebaut und eine Variable zum „Aktiviern/Deaktivieren“ gesetzt.

Das hat soweit auch gut funktioniert, aber ich wollte eigentlich was anderes.

Zum System, ich habe 6 Sprinklerstränge, die von Magnetventilen geöffnet und geschlossen werden. Die Magnetventile werden von HomeMatic IP Wired geschaltet.

Das Funktioniert soweit.

Jetzt soll jeder Strang nach einander für 20min „offen“ sein.

Da Skripte nicht länger als 30sek sein sollen, kommt hier wohl der TimerEvent Befehl zum Einsatz.

Also für alle 6 Sprinklerstränge ein Skript angelegt.

hier ein Beispiel:

// Sprinkler 4 Ein- und Ausschalten
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    RequestAction(31915, false);
    
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
}
else
{
    //An Befehl
     RequestAction(31915, true);

    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}

zum Testen mal 60sek.

Funktioniert auch, jetzt aber zu meinem Problem. Wie mache ich weiter. Erst dachte ich, ich kann einfach in einem Skript alle 6 Sträng nach einander mit dem TimerEvent für 60sek laufen lassen, aber es gehen immer alle gleichzeitig an.

Hier ein Beispiel:

// Sprinkler 4 Ein- und Ausschalten
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    RequestAction(31915, false);
    
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
}
else
{
    //An Befehl
     RequestAction(31915, true);

    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}
// Sprinkler 5 Ein- und Ausschalten
if($_IPS['SENDER'] == "TimerEvent")
{
    //Aus Befehl
    RequestAction(31916, false);
    
    //Timer ausschalten
    IPS_SetScriptTimer($_IPS['SELF'], 0);
}
else
{
    //An Befehl
     RequestAction(31916, true);

    //Timer anschalten
    IPS_SetScriptTimer($_IPS['SELF'], 60);
}

Das war also auch nicht die Lösung.

  1. Idee, alle 6 Sprinklerstränge in 6 Einzelne Skripte und ein Hauptskript, welches nach einander die Sprinkler startet.

Beispiel:

IPS_RunScriptWait(23336);

IPS_RunScriptWait(30719);

IPS_RunScriptWait(23217);

Aber die Starten auch alle gleichzeitig dann.

Es ist sicher nur ein kleiner Denkfehler, aber ich komme nicht drauf.

Wer kann mir einen stoß in die richtige Richtung geben?

Viele Dank!

Gruß Sven

Was ist genau das Problem? Willst Du erst Sprinkler 1 für 60 Sekunden laufen lassen, dann Sprinkler 2 für 60 Sekunden laufen lassen und so weiter?

Falls ja, lege Dir eine Variable an, die zählt.

<?php
$Zaehler = GetValue(12345);

switch ($Zaehler) {
    case 0:
        // Sprinkler 1 an
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(12345, 1);
        break;
    
    case 1:
        // Sprinkler 1 aus
        // Sprinkler 2 an
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(12345, 2);
        break;

       // und so weiter
    
    case 7:
        // alle Sprinkler aus
        IPS_SetScriptTimer($_IPS['SELF'], 0);
        SetValue(12345, 0);
        break;
} 

So in etwa auf die Schnelle hingeschrieben.

Guten Abend,

naja, auf die Idee bin ich nicht gekommen, wohl auch Mangels Ahnung! :slight_smile:

Ich habe jetzt mal folgendes versucht.

<?php
$Zaehler = GetValue(12345);

switch ($Zaehler) {
    case 0:
        RequestAction(31915, true);
        IPS_SetScriptTimer($_IPS['SELF'], 20);
        SetValue(12345, 1);
        break;
    
    case 1:
        RequestAction(31915, false);
        RequestAction(15526, true);
        IPS_SetScriptTimer($_IPS['SELF'], 20);
        SetValue(12345, 2);
        break;

    case 2:
        RequestAction(15526, false);
        RequestAction(41654, true);
        IPS_SetScriptTimer($_IPS['SELF'], 20);
        SetValue(12345, 3);
        break;

    case 3:
        RequestAction(41654, false);
        IPS_SetScriptTimer($_IPS['SELF'], 0);
        SetValue(12345, 0);
        break;
}
  1. Er beschwert sich, das die Variable nicht existiert. (Warning: Variable #12345 existiert nicht in /mnt/data/symcon/scripts/45090.ips.php on line 2) startet aber dennoch.

  2. was viel schlimmer ist, er bleibt so nicht für 20sek an und springt zum nächsten Sprinkler, sondern startet alle 20sek den 1. Sprinkler.

Sprich der ScriptTimer (Ereignis: Täglich alle 20 Sekunde(n)) ist so eingestellt…

Du hast meinen Hinweis überlesen:

Gleichzeitig lies bitte folgenden Abschnitt der Dokumentation:
https://www.symcon.de/service/dokumentation/befehlsreferenz/variablenzugriff/setvalue/

Falls es danach immer noch nicht funktioniert oder Unklarheiten bestehen, melde Dich noch mal hier.

Gleichzeitiger Post, während dem Schreiben kam deine Antwort.

So, ich habe das ganzen endlich am laufen.

<?php
$sprinkler = GetValue(51614);

switch ($sprinkler) {
    case "1":
        RequestAction(22514, true);
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(51614, "2");
        break;
    case "2":
        RequestAction(22514, false);
        RequestAction(40781, true);
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(51614, "3");
        break;
    case "3":
        RequestAction(40781, false);
        RequestAction(25786, true);
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(51614, "4");
        break;
    case "4":
        RequestAction(25786, false);
        RequestAction(31915, true);
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(51614, "5");
        break;
    case "5":
        RequestAction(31915, false);
        RequestAction(15526, true);
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(51614, "6");
        break;
    case "6":
        RequestAction(15526, false);
        RequestAction(41654, true);
        IPS_SetScriptTimer($_IPS['SELF'], 60);
        SetValue(51614, "7");
        break;
    case "7":
        RequestAction(41654, false);
        SetValue(51614, "0");
        break;        
}
?>

jetzt läuft alle 60sek ein Sprinklerstrang.

Ich konnte mir nicht erklären, was die „externe“ variable soll, erklären kann ich sie mir immer noch nicht, aber damit funktioniert es.

Kann ich nicht eine Script interne Variable nutzen? Dient Sie ausschließlich zum start des Scriptes von „Außen“?

Vielen Dank für die Tipps.

Gruß Sven

Freut mich, dass es läuft.

Eine „interne“ Variable steht nur zur Laufzeit des Skriptes zur Verfügung und ist danach weg. Damit das Skript beim Start weiß, in welchen case vom switch es springen soll, wird diese Info in einer „externen“ Variable abgespeichert und bei Start des Skriptes abgeholt.

Ich empfinde dies als einfachste Variante für eine kleine Ablaufsteuerung.

Hey,

ja vielen Dank, bin ein gutes Stück weiter.

Ich habe noch ein paar „Funktionen“ hin zu gefügt. Ich habe eine „Externe“ Variable für die die Zeit in Minuten und eine für die Zeit in Sekunden angelegt.

Wenn man in der Minutenvariablen 1 einträgt, wird per Ereignis in die Sekundenvariable 60 (1x60) geschrieben. Das funktioniert soweit auch und wird im Script ebenfallsumgesetzt.

Hintergrund, ich möchte im Webfront gerne auch mal die Zeitanpassen können.(Kam mir im laufe des Tages als Idee)

Aber ich Scheiter an einer eigentlich ganz einfachen Geschichte, wie kann ich im Frontend z.B. den Wert einer Boolean oder Integer Variablen verändern. Ich dachte ich müsste ein Switch (Boolean) oder ein anders Profi hinterlegen. Aber dadurch ändert sich das ganze im Webfront nicht, es wird der Wert angezeigt, aber ich kann nichts ändern, oder auch nur An/Aus switchen.

Wo hab ich den Denkfehler?

Viele Grüße

habs gefunden…

ActionSkript scheint zu fehlen.

ja, wusste nur nicht, was rein muss, aber mit „+“ erstellt er es ja.

Danke!

So, wie schon gesagt, läuft es jetzt.

Für die Interessierten unter euch.

Wie bereits gesagt, ich habe 6 Sprinklerstränge. Diese werden von HomeMatic IP Wired und Magnetventilen geöffnet und geschlossen.

Meine Sprinklersteuerung sieht jetzt vor, das ich ein Script habe in dem ein Sprinklerstrang nach dem anderen für eine bestimmte Zeit läuft.

Diese Zeit nimmt er aus einer Variablen im Frontend, die in 5min schritten ausgewählt werden kann. Die Minuten werden in Sekunden umgerechnet und in eine weitere Variable geschrieben, diese zieht sich das Script dann.

Dann habe ich noch Variablen die, mir anzeigen, ob das Script gerade läuft.

So kann ich nach bedarf die Bewässerungsdauer anpassen (ohne das Programm um zu schreiben) und kann auch mal außer der Reihe Netzen.

Dann gibt es noch ein Tägliches Ereignis, welches um 6 Uhr morgens das Sprinklerprogramm aus diesem Script hier startet, vorausgesetzt, eine weitere Variable steht auf True, so kann ich bestimmen ob Täglich bewässert wird oder nicht.

Schonmal ganz nett soweit.

Ziele für die Zukunft:
Ich habe die HomeMatic Wetterstation Pro, diese sagt mir, ob es gerade regnet oder nicht. Wenn es regnet, soll das Sprinklerprogramm Blockiert werden (das sollte nicht so schwierig sein).

Weiter möchte ich noch den Regenfall der letzten Tage messen und gegeben falls, einfließen lassen, hier bin ich noch unsicher, wie und warum… :slight_smile: mal drüber nachdenken.

Vielen Dank für die Unterstützung!

Gruß Sven

hier mal noch das Skript und ein Paar Bilder, wenn jemand mehr wissen möchte, gerne schreiben.

<?php
$sprinkler = GetValue(51614);
$sprinklerdauer = GetValue(26985);

switch ($sprinkler) {
    case "1":
        RequestAction(22514, true);
        IPS_SetScriptTimer($_IPS['SELF'], $sprinklerdauer);
        SetValue(51614, "2");
        break;
    case "2":
        RequestAction(22514, false);
        RequestAction(40781, true);
        IPS_SetScriptTimer($_IPS['SELF'], $sprinklerdauer);
        SetValue(51614, "3");
        break;
    case "3":
        RequestAction(40781, false);
        RequestAction(25786, true);
        IPS_SetScriptTimer($_IPS['SELF'], $sprinklerdauer);
        SetValue(51614, "4");
        break;
    case "4":
        RequestAction(25786, false);
        RequestAction(31915, true);
        IPS_SetScriptTimer($_IPS['SELF'], $sprinklerdauer);
        SetValue(51614, "5");
        break;
    case "5":
        RequestAction(31915, false);
        RequestAction(15526, true);
        IPS_SetScriptTimer($_IPS['SELF'], $sprinklerdauer);
        SetValue(51614, "6");
        break;
    case "6":
        RequestAction(15526, false);
        RequestAction(41654, true);
        IPS_SetScriptTimer($_IPS['SELF'], $sprinklerdauer);
        SetValue(51614, "7");
        break;
    case "7":
        RequestAction(41654, false);
        SetValue(51614, "0");
        break;        
}
?>