Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Problem im Skript mit Variablen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Problem im Skript mit Variablen

    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      erh_stgt last edited by

      Hallo Forum,

      ich hab es tatsächlich geschafft, dass ich mit VIS meine GArtenbewässerung einschalten kann.

      ich möchte da jetzt etwas automatik reinbringen, was auch teilweise klappt:

      Die Pumpe geht an, der Trafo für die Ventile wird eingestellt und die Ventile gehen auf.7

      Jetzt wollte ich noch über ein Feld im VIS die Dauer einstellen können und den Ausschaltzeitpunkt dann im Skript zum Ausschalten verwenden. Da scheint aber was nicht zu funktionieren - sobald ich statt einer Zahl im setStateDelayed die DAuer mit dieser Variable multipliziere, funktioniert der Befehl nicht mehr zeitversetzt.

      Was mache ich da falsch? oder darf man bei SetStateDelayed nur Zahlen eingeben aber keine VErknüpüfungen mit Variablen?7

      kann mir wer weiterhelfen, wie ich das verknüpft bekomme? Natürlich sind auch weitere Hinweise zur VErbesserung gerne gesehen. Ich bin mir sicher, ich hab das nicht auf die beste Art gemacht - aber halt so wie ich es verstehe und so, dass es tatsächlich funktioniert hat (zumindest großteils….).

      (zur Info: die Dauern im Skript sind noch sehr kurz zum Testen, da ist mir schon klar ...).

      // Script zum Starten der Gartenbewässerung
      
      // Datenpunkt-ID
      var idBewKreis_S1 = "hm-rpc.0.NEQ016828.1.STATE";  // Verknüpfung mit Aktor für S1 (Sprüher Ost)
      var idBewKreis_S2 = "hm-rpc.0.NEQ016828.2.STATE";  // Verknüpfung mit Aktor für S2 (MP-Rotatoren West)
      var idBewKreis_S3 = "hm-rpc.0.NEQ016828.3.STATE";  // Verknüpfung mit Aktor für S3 (Tröpfchenbewässerung Böschung West)
      var idBewKreis_S4 = "hm-rpc.0.NEQ016828.4.STATE";  // Verknüpfung mit Aktor für S4 (Tröpfchenbewässerung Ost)
      var idPumpe = "hm-rpc.0.NEQ0168283.1.STATE";        // Verknüpfung mit Aktor für Steckdose Pumpe
      var idVentilversorgung = "hm-rpc.0.NEQ016823.2.STATE";        // Verknüpfung mit Aktor für Steckdose Pumpe
      var idTasterS1 = "vis.0.idTasterS1"
      var idTasterS2 = "vis.0.idTasterS2"
      var idTasterS3 = "vis.0.idTasterS3"
      var idTasterS4 = "vis.0.idTasterS4"
      var BewDauer = "vis.0.Bewaesserungsdauer"
      var BewDauerKorr
      
      // Variablendeklaration 
      //var Bodenfeuchte;
      
      on({id: idTasterS1, val: true}, Kreis_S1); // Aufruf der Funktion bei Änderung von false auf true
      
      function Kreis_S1() {
           BewDauerKorr = BewDauer * 1000; // Bewässerungdauer plus Vorlaufzeit für Druckaufbau Pumpe
           setState(idPumpe, true);  // Pumpe einschalten
           setState(idVentilversorgung, true);  // Ventil-Spannungsversorgung einschalten
           setStateDelayed(idBewKreis_S1, true, 1*6000);  // Ventil einschalten
           setStateDelayed(idTasterS1, false, BewDauerKorr);
      }
      
      on({id: idTasterS1, val: false}, Kreis_S1_off); // Aufruf der Funktion bei Änderung von false auf true
      
      function Kreis_S1_off() {
           setState(idBewKreis_S1, false);  // Ventil ausschalten
           setStateDelayed(idPumpe, false, 5000);  // Pumpe ausschalten
           setStateDelayed(idVentilversorgung, false, 5000);  // Ventil-Spannungsversorgung ausschalten
      }
      
      on({id: idTasterS2, val: true}, Kreis_S2); // Aufruf der Funktion bei Änderung von false auf true
      
      function Kreis_S2() {
           setState(idPumpe, true);  // Pumpe einschalten
           setState(idVentilversorgung, true);  // Ventil-Spannungsversorgung einschalten
           setStateDelayed(idBewKreis_S2, true,  2*60000);  // Ventil einschalten
           setStateDelayed(idBewKreis_S2, false,  Bewaesserungsdauer*60000);  // Ventil ausschalten nach Bewässerungsdauer
           setState(idTasterS2, false);
           //setStateDelayed(idPumpe, false, 1*60000);  // Pumpe ausschalten
           //setStateDelayed(idVentilversorgung, false, 1*60);  // Ventil-Spannungsversorgung ausschalten
      }
      
      
      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        Ein Fehler:

             BewDauerKorr = getState(BewDauer).val * 1000; // Bewässerungdauer plus Vorlaufzeit für Druckaufbau Pumpe
        
        

        Zweiter, dass die Variable Bewaesserungsdauer in

             setStateDelayed(idBewKreis_S2, false,  Bewaesserungsdauer*60000);  // Ventil ausschalten nach Bewässerungsdauer
        
        

        nirgendwo gesetzt ist.

        1 Reply Last reply Reply Quote 0
        • E
          erh_stgt last edited by

          die wichtigsten Teil hatte ich im Code weggelassen.

          also hier nochmal, es geht um folgende Zeile:

          setStateDelayed(idBewKreis_S1, true, BewDauerKorr*6000); // Ventil einschalten

          Wenn ich wieder statt "BewDauerKirr" durch eine Zahl ersetzte, funktionierts wieder….

          // Script zum Starten der Gartenbewässerung
          
          // Datenpunkt-ID
          var idBewKreis_S1 = "hm-rpc.0.NEQ016828.1.STATE";  // Verknüpfung mit Aktor für S1 (Sprüher Ost)
          var idBewKreis_S2 = "hm-rpc.0.NEQ016828.2.STATE";  // Verknüpfung mit Aktor für S2 (MP-Rotatoren West)
          var idBewKreis_S3 = "hm-rpc.0.NEQ016828.3.STATE";  // Verknüpfung mit Aktor für S3 (Tröpfchenbewässerung Böschung West)
          var idBewKreis_S4 = "hm-rpc.0.NEQ016828.4.STATE";  // Verknüpfung mit Aktor für S4 (Tröpfchenbewässerung Ost)
          var idPumpe = "hm-rpc.0.NEQ0168283.1.STATE";        // Verknüpfung mit Aktor für Steckdose Pumpe
          var idVentilversorgung = "hm-rpc.0.NEQ016823.2.STATE";        // Verknüpfung mit Aktor für Steckdose Pumpe
          var idTasterS1 = "vis.0.idTasterS1"
          var idTasterS2 = "vis.0.idTasterS2"
          var idTasterS3 = "vis.0.idTasterS3"
          var idTasterS4 = "vis.0.idTasterS4"
          var BewDauer = "vis.0.Bewaesserungsdauer"
          var BewDauerKorr
          
          // Variablendeklaration 
          //var Bodenfeuchte;
          
          on({id: idTasterS1, val: true}, Kreis_S1); // Aufruf der Funktion bei Änderung von false auf true
          
          function Kreis_S1() {
               BewDauerKorr = BewDauer * 1000; // Bewässerungdauer plus Vorlaufzeit für Druckaufbau Pumpe
               setState(idPumpe, true);  // Pumpe einschalten
               setState(idVentilversorgung, true);  // Ventil-Spannungsversorgung einschalten
               setStateDelayed(idBewKreis_S1, true, BewDauerKorr*6000);  // Ventil einschalten
               setStateDelayed(idTasterS1, false, BewDauerKorr);
          }
          
          on({id: idTasterS1, val: false}, Kreis_S1_off); // Aufruf der Funktion bei Änderung von false auf true
          
          function Kreis_S1_off() {
               setState(idBewKreis_S1, false);  // Ventil ausschalten
               setStateDelayed(idPumpe, false, 5000);  // Pumpe ausschalten
               setStateDelayed(idVentilversorgung, false, 5000);  // Ventil-Spannungsversorgung ausschalten
          }
          
          
          1 Reply Last reply Reply Quote 0
          • S
            steinwedel last edited by

            Hallo

            Bluefox hat Dir eigentlich Dein Problem schon beantwortet, vielleicht etwas zu knapp formuliert. Aber für die "Blutigen" hier noch ein paar Worte:

            Du hast Dein Problem lokalisiert:

            setStateDelayed(idBewKreis_S1, true, BewDauerKorr*6000); // Ventil einschalten
            

            Es hängt mit BewDauerKorr zusammen. Wie Du bereits festgestellt hat funktioniert alles, wenn Du "BewDauerKorr" durch eine Zahl ersetzt.

            Die Frage ist, was "vis.0.Bewaesserungsdauer" * 1000 * 6000 ergibt? Bei den Simpsons müsste Bart 6.000.000 Mal "vis.0.Bewaesserungsdauer" an die Tafel schreiben. ioBroker wird Dir wohl nur einen Vogel zeigen. Einen String kann man nicht mit einer Variablen multiplizieren. Eigentlich möchtest DU den Wert von "vis.0.Bewaesserungsdauer" haben. Da "vis.0.Bewaesserungsdauer" keine Variable in Javascript ist, sondern ein State von ioBroker musst Du die den Wert holen:

            getState("vis.0.Bewaesserungsdauer").val
            

            Trotzdem wirst Du wohl kaum Glück haben. Ich bin mal so frech und wage zu behaupten, dass Du keinen State "vis.0.Bewaesserungsdauer" hast. Kannst Du ja mal mittels Objekte im Administrator vergleichen. Hintergrund ist, dass Vis in der Regel keine Daten direkt zur Verfügung stellt. Vielmehr musst Du dem Widget den State in Vis mitteilen, in den die Eingabe gespeichert werden soll. Am einfachsten Du erzeugst mittels Javascript einen State (siehe Javascript-Anleitung) und setzt auch einen Defaultwert. Dieses verhindert, dass Dein Programm abstürzt, wenn es den State abfragt. Nachdem das State erstmalig angelegt wurde, stellst Du die Verknüpfung zwischen Vis und dem State her (also entsprechend beidem Widget eintragen). Jetzt sollte es laufen. Dein Skript wirst Du sicherlich auch an anderer Stelle noch überarbeiten dürfen.

            Eine Frage interessehalber: Wie ermittelst Du die Bodenfeuchtigkeit?

            Gruß Gerhard

            1 Reply Last reply Reply Quote 0
            • E
              erh_stgt last edited by

              Danke an die Rückmeldungen!

              @ Bluefox: ich hatte deine Antwort übersehen und wollte nur das Skript nochmal posten.

              @ Steinwedel: Danke für die Erklärung - ohne hätte ich es nicht verstanden, und mit deiner Hintergrundinfo bekomme ich vielleicht auch eine Lösung hin.

              Und zur Bodenfeuchte: von solchen Dingen bin ich noch seeeehr weit entfernt, ich hab mich zwar schon umgesehen, aber dafür muss ich noch einiges mehr an Übung mit Java bekommen…..

              1 Reply Last reply Reply Quote 0
              • E
                erh_stgt last edited by

                kleiner Nachtrag:

                es funktioniert jetzt! und zwar mit folgender Zeile:

                BewDauerKorr = getState("vis.0.Bewaesserungsdauer").val * 1 + 1;

                Ich hab den Hinweis auf den State erst nicht verstanden - dann aber kapiert was gemeint war.

                was ich nicht verstehe - warum ist das Ergebnis 4 wenn ich bei getState mit *1 multipliziere - aber 31 wenn ich nicht mit *1 multipliziere.

                Danke nochmal!

                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  @erh_stgt:

                  Ich hab den Hinweis auf den State erst nicht verstanden - dann aber kapiert was gemeint war.

                  was ich nicht verstehe - warum ist das Ergebnis 4 wenn ich bei getState mit *1 multipliziere - aber 31 wenn ich nicht mit *1 multipliziere. `

                  "3" + 1 = "31"
                  "3" * 1 = 3
                  "3" * 1 + 1 = 4
                  

                  Weil deine Variable String ist.

                  Ganz richtig ist:

                  BewDauerKorr = parseFloat(getState("vis.0.Bewaesserungsdauer").val) + 1; 
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  895
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  3
                  7
                  1224
                  Loading More Posts
                  • Oldest to Newest
                  • Newest to Oldest
                  • Most Votes
                  Reply
                  • Reply as topic
                  Log in to reply
                  Community
                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                  The ioBroker Community 2014-2023
                  logo