+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 15
  1. #1
    Registriert seit
    Dec 2018
    Beiträge
    16

    Standard Skript über Variable starten, warum springt die Variable zurück?

    Servus,

    bin noch neu im Geschäft, hatte jetzt ein paar Monate pause, jetzt mit neuen Komponenten, werden auch neue Ideen umgesetzt.

    Ich will nur ne Kleinigkeit machen, funktioniert aber leider nur halb!

    Ich hab ne Variable (Boolean, Fals), ID 14762, angelegt, welche ein "Switch" Profil hinterlegt hat, (false = aus, true = an) so der Plan.

    Dann habe ich ein Skript "dahinter":

    PHP-Code:
    <?

    $Request 
    GetValue(14762);


    if (
    $Request false
        {
              
        } 
        else 
        {
            
    HM_WriteValueBoolean(17228"STATE"true);
            
    IPS_Sleep(1000);
            
    HM_WriteValueBoolean(17228"STATE"false);
            
    HM_WriteValueBoolean(57134"STATE"true);
            
    IPS_Sleep(1000);
            
    HM_WriteValueBoolean(57134"STATE"false);
            
    HM_WriteValueBoolean(17838"STATE"true);
            
    IPS_Sleep(1000);
            
    HM_WriteValueBoolean(17838"STATE"false);
            
    HM_WriteValueBoolean(42620"STATE"true);
            
    IPS_Sleep(1000);
            
    HM_WriteValueBoolean(42620"STATE"false);
            
    HM_WriteValueBoolean(19492"STATE"true);
            
    IPS_Sleep(1000);
            
    HM_WriteValueBoolean(19492"STATE"false);
            
    HM_WriteValueBoolean(15067"STATE"true);
            
    IPS_Sleep(1000);
            
    HM_WriteValueBoolean(15067"STATE"false);
        }

    ?>
    Soweit so gut. Wenn ich jetzt die Variable "anklicke" läuft mein Skript auch an. Das ist die Hälfte die Funktioniert. Aber leider bleibt das "An"nicht Blau sondern die Variable scheint direkt wieder auf fals (=Aus) zu springen. Gut sonst würde mein Skript auch wieder von vorne los laufen, aber das wäre mir dann aufgefallen und nicht jetzt beim Tippen! Aber grundsätzlich müsste die Variable doch auf true stehen und nicht wieder "von allein" zurück springen, oder?

    Gruß Sven

  2. #2
    Registriert seit
    Dec 2018
    Beiträge
    16

    wenn die Variable auf true stehen würde, könne ich das gleich als anzeige nutzten, das das skript am laufen ist.

    so war der Plan...

  3. #3
    Registriert seit
    Jun 2012
    Ort
    House of Dragons @ Lübeck
    Beiträge
    9,427

    Da ist kein SetValue in deinem Script, welches die Variable jemals setzen könnte.
    Somit bleibt die immer im alten Zustand.
    Das AktionsSkript in der Doku zeigt die eine Zeile welche es braucht damit die Variable umspringt.
    Beispiel 1:
    Aktionsskripte — IP-Symcon :: Automatisierungssoftware

    Da Scripte nach Möglichkeit niemals so lange mit Sleep pausieren sollten, löst man das mit einer weiteren Variable als Zähler und einem ScriptTimer.
    Das Beispiel finde ich aber von unterwegs gerade nicht
    Michael
    on Win7VM (ESXi): I5, 24GB RAM, HW-RAID5, 3xSat | HW: CCU + 123 Geräte (506ch), EM1000, CUL, 1Wire, XBee, ELRO 433MHz, FritzBox Cable, Android Phone + Tablet, Samsung C-Serie TV +SamyGo-Ext, Onkyo NR| SW: IPS, Apache2(mod_ssl/PHP), MySQL, hMailServer, PRTG, Rising AV, Piwik, RoundCube, Wordpress, WinLIRC, WHS2011, MediaPortal, XBMC

  4. #4
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    6,731

    Zitat Zitat von daMeier Beitrag anzeigen

    PHP-Code:
    if ($Request false
        {
              
        } 
    Du willst auf false prüfen das wäre
    PHP-Code:
    if($Request == false
    oder
    PHP-Code:
    if(!$Request
    Wenn Du nur ein = setzt heisst das, dass Du den Wert auf false setzt nicht das Du auf false vergleichst. Dazu musst Du == benutzten.

  5. #5
    Registriert seit
    Dec 2018
    Beiträge
    16

    Morgen,

    bin ja auch doof Das Skript startet ja nicht, weil die Prüfung klappt, sonder weil es eine Aktion der Variablen ist.

    Habe es jetzt auch anders gelöst. Ich habe 2 Variablen gemacht. Mit der Einen starte ich nur das Skript als Aktion, dann schreibt das Skript in die andere Variable "1" beim start und "0" beim ende. Diese Variable zeigt dann bei "1" das es Läuft und bei "0" das es Aus ist.

    So passt mir das. Hoffe das ist auch von der Umsetzung her Ok. Leider komme ich gerade nicht an mein Skript ran, sonst hätte ich den Code noch zum Verständnis gepostet, werde ich nachholen.


    Nächste Baustelle. Der "IPS_Sleep(1000)" ist nur ein Zwischenschritt. genau genommen muss dazwischen 15-20min gewartet werden.

    Irgendwo habe ich im Hinterkopf, gelesen zu haben, dass ein Skript nur 30sek dauern darf, stimmt das?

    Wie kann ich das dann realisieren?

    Viele Grüße

  6. #6
    Registriert seit
    Oct 2007
    Ort
    Villach,Kärnten,Österreich
    Beiträge
    2,982

    Hi
    ich mach das mit den Pushbuttons generell so:

    "SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);"
    Dies wird als Aktionsscript bei der Buttonvariable hinterlegt. Damit toggelt schon mal der Button im WF, tut aber noch nichts.

    Um nun ein oder mehrere Scripte durch den Button zu starten füge ich dem Script ein Ereignis hinzu welches durch die Buttonvariable ausgelöst wird. Da kann man dann schon mal gleich vorauswählen ob das Ereignis bei True/False usw. auslöst und man spart sich die Abfrage im Script.

    Weiters läßt sich sich damit das Script für debugzwecke auch jederzeit händisch starten. Hast du nämlich IPS_[Value] oder so im Script läuft es nicht händisch, da ihm ja IPS[Value] fehlt.

    Für Quick/Dirty Sachen finde ich die Methode recht brauchbar, bei komplexeren Aufgaben lohnt es sich aber den Button anzeigen zu lassen ob die Aufgabe auch erforlgreich war.

    Zu IPS_Sleep: Ja lange "Sleep" oder "Wait" haben in einem ereignisgesteuertem System nichts zu suchen.
    Die Vorgehensweise ist folgende: Dort wo du das Sleep benötigst startets du einen Timer mit der gewünschten Wartezeit und terminierts das Script.
    Dann brauchst ein Ereignis welches durch den Timer ausgelöst wird. d.h. der Timer startet nach Ablauf der Zeit das Script neu.
    Innerhalb des Scriptes fragst du nun ab wer es gestartet hat.
    War es der Timer wird der Teil ausgeführt welcher nach Ablauf des Sleep vorgesehen war.
    War es etwas anderes, dann normaler Start.

    Ich glaub irgendwo in der Hilfe gibt es auch ein schönes bsp. dazu, finds aber grad net.


    gruß
    bb
    Geändert von bbernhard (14.06.19 um 07:58 Uhr)

  7. #7
    Registriert seit
    Nov 2009
    Ort
    Essen
    Beiträge
    2,090

    Zitat Zitat von daMeier Beitrag anzeigen
    Irgendwo habe ich im Hinterkopf, gelesen zu haben, dass ein Skript nur 30sek dauern darf, stimmt das?

    Wie kann ich das dann realisieren?
    Richtig.

    Du realisierst es so, wie es Dir weiter oben vorgeschlagen wurde. Beispielsweise über eine Hilfsvariable, die bei jedem Aufruf des Skriptes um 1 hochgezählt wird. Beim Aufruf des Skriptes fragst Du die Variable ab. Ich nutze dazu PHP switch. Innerhalb der case Angaben setzt Du einen Skripttimer auf das Skript und zählst die Hilfsvariable um 1 hoch. Im letzten Schritt setzt Du den Timer auf 0 und die Hilfsvariable ebenfalls.
    Deutschlandweite Dienstleistungen rund um und mit IP-Symcon. Systemintegrator im Bereich KNX. ekey Partner. Infos unter https://schrader-it.net

  8. #8
    Registriert seit
    Dec 2018
    Beiträge
    16

    Morgen,

    Zitat Zitat von bbernhard Beitrag anzeigen
    Hi
    Zu IPS_Sleep: Ja lange "Sleep" oder "Wait" haben in einem ereignisgesteuertem System nichts zu suchen.
    Die Vorgehensweise ist folgende: Dort wo du das Sleep benötigst startets du einen Timer mit der gewünschten Wartezeit und terminierts das Script.
    Dann brauchst ein Ereignis welches durch den Timer ausgelöst wird. d.h. der Timer startet nach Ablauf der Zeit das Script neu.
    Innerhalb des Scriptes fragst du nun ab wer es gestartet hat.
    War es der Timer wird der Teil ausgeführt welcher nach Ablauf des Sleep vorgesehen war.
    War es etwas anderes, dann normaler Start.

    Ich glaub irgendwo in der Hilfe gibt es auch ein schönes bsp. dazu, finds aber grad net.


    gruß
    bb
    Ok, leider weiß ich noch absolut nicht, wie ich das umsetzten kann, wenn du nen Anleitung kennst oder ein Beispiel schick mal bitte, damit ich mich da schlau machen kann.

    Danke! Gruß
    Sven

  9. #9
    Registriert seit
    Oct 2011
    Ort
    Hattersheim (Hessen)
    Beiträge
    6,731

    Zitat Zitat von daMeier Beitrag anzeigen
    wenn du nen Anleitung kennst oder ein Beispiel schick mal bitte, damit ich mich da schlau machen kann.
    Wie kann ich ... ?

  10. #10
    Registriert seit
    Oct 2007
    Ort
    Villach,Kärnten,Österreich
    Beiträge
    2,982

    Fonzo hats gefunden und war mal wieder schneller.


    Ein Beispiel kann ich dir gerne geben, allerdings wurden durch den aktuellen Hype alles in ein Modul zu pressen viel meiner älteren Scripte entsorgt.
    Dieses ist mir geblieben, da es recht einfach ist könntest du evtl. was nützliches rauslesen:
    Das Script kann folgendes:
    Per Variable im Webfront kann man verschiedene Modi der Gartenbewässerung einstellen.
    Ein / Aus / 1x Ein für bestimmte Zeit / jeden Tag ein für bestimmte Zeit Ein
    Die Zeit wie lange die Bewässerung eingeschaltet sein soll ist auch per Webfront einstellbar.

    Und darum geht es auch bei dir. Die Einschaltzeit (bei mir mehrere Minuten, bei dir Sekunden) darf man nicht per IPS_Sleeep erzeugen.
    Daher wird das über einen Timer gemacht.


    PHP-Code:
    <?

    $idEventDay 
    =12301 /*[Program\Bewässerung\Blumenbeet & Garten\Ein]*//*[Program\Bewässeung\Blumenbeet & Garten\]*/;
    $idEventDayOff 13138 /*[Program\Bewässerung\Blumenbeet & Garten\Aus]*/;
    $idEventDuration 44905 /*[Program\Bewässerung\Blumenbeet & Garten\setStatus Blumenbeet\Täglich alle 15 Minuten]*/;
    $idDuration 46669 /*[Program\Bewässerung\Blumenbeet & Garten\Dauer]*/;
    $idSelection 36555 /*[Program\Bewässerung\Blumenbeet & Garten]*/;
    $idValveStatus 52873 /*[Program\Bewässerung\Garten_Status]*/;

    Switch (
    $_IPS['SENDER'])
        {
        Default:
           break;

        Case 
    "TimerEvent":
         if (
    $_IPS['EVENT']== $idEventDuration) {
             if (
    GetValue($idSelection)==2) {
                 
    SetValue($idSelection,0);
                 
    IPS_SetEventActive($idEventDuration,False);
                 }
             }
          break;

       Case 
    "Execute":

        Case 
    "Variable":
        
        
    $callerVar $_IPS['VARIABLE'];
        If (
    $callerVar == $idDuration) {
                
    IPS_SetEventCyclic ($idEventDuration 00002,GetValue($idDuration));
                 
    IPS_SetEventCyclicTimeFrom($idEventDuration,date('H'time()),date('i'time()),date('s'time()));
             if (
    GetValue($idSelection)==2) {
                    
    IPS_SetEventActive($idEventDuration,True);
                 
    SetValue($idValveStatus,True);
             }
            }

        if (
    $idSelection) {
            if (
    GetValue($idSelection) ==0) {   /* AUS*/
                
    SetValue($idValveStatus,False);
                
    IPS_SetHidden ($idDuration,True);
                
    IPS_SetHidden ($idEventDay,True);
                
    IPS_SetHidden($idEventDayOff,True);
                
    IPS_SetEventActive($idEventDuration,False);
                
    IPS_SetEventActive($idEventDay,False);
                
    IPS_SetEventActive($idEventDayOff,False);
                
            }

            if (
    GetValue($idSelection)==1) {  /*EIN*/
                
    SetValue($idValveStatus,True);
                
    IPS_SetHidden ($idDuration,True);
                
    IPS_SetHidden ($idEventDay,True);
                
    IPS_SetHidden($idEventDayOff,True);
                
    IPS_SetEventActive($idEventDuration,False);
                
    IPS_SetEventActive($idEventDay,False);
                
    IPS_SetEventActive($idEventDayOff,False);
            }

            if (
    GetValue($idSelection)==2) { /* Timer 1x*/
                
    IPS_SetEventCyclicTimeFrom($idEventDuration,date('H'time()),date('i'time()),date('s'time()));
                
    SetValue($idValveStatus,True);
                
    IPS_SetHidden ($idDuration,False);
                
    IPS_SetHidden ($idEventDay,True);
                
    IPS_SetHidden($idEventDayOff,True);
                
    IPS_SetEventActive($idEventDuration,True);
            }

            if (
    GetValue($idSelection)==3) { /* Timer täglich */
                
    IPS_SetHidden ($idDuration,True);
                
    IPS_SetHidden ($idEventDay,False);
                
    IPS_SetHidden($idEventDayOff,false);
                
    IPS_SetEventActive($idEventDuration,False);
                
    SetValue($idValveStatus,False);
                
    IPS_SetEventActive($idEventDay,true);
            }

          if (
    GetValue($idSelection)==4) { /* Timer täglich ausgelöst durch Timer*/
                
    IPS_SetHidden ($idDuration,False);
                
    IPS_SetHidden ($idEventDay,False);
                
    IPS_SetEventActive($idEventDuration,True);
                
    SetValue($idValveStatus,true);
                
    IPS_SetEventActive($idEventDay,true);
            }


        }
    }

    ?>
    der Verzeichnisbaum dazu sieht so aus:
    Name:  Unbenannt.JPG
Hits: 114
Größe:  43.8 KB

    schöne Grüße
    Bernhard
    Geändert von bbernhard (14.06.19 um 19:21 Uhr)

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 24.06.17, 14:16
  2. Warum wird die Variable niemals geändert
    Von theoldphilip im Forum Skripte, PHP, SQL
    Antworten: 4
    Letzter Beitrag: 12.12.15, 23:01
  3. Variable über Skript aktualisieren
    Von MrEASY im Forum Skripte, PHP, SQL
    Antworten: 4
    Letzter Beitrag: 08.10.15, 20:32
  4. Skript starten, wenn Variable über Webfront geändert wurde
    Von Detective im Forum Skripte, PHP, SQL
    Antworten: 1
    Letzter Beitrag: 11.11.14, 13:23
  5. IR Trans: String Variable überwachen und Skript starten
    Von roadsterhh im Forum Skripte, PHP, SQL
    Antworten: 7
    Letzter Beitrag: 16.04.12, 12:32