Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Problem im Skript mit Variablen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    943

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Problem im Skript mit Variablen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
7 Beiträge 3 Kommentatoren 1.3k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • E Offline
    E Offline
    erh_stgt
    schrieb am zuletzt editiert von
    #1

    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
    }
    
    

    Blutigster Anfänger übelster Sorte….

    1 Antwort Letzte Antwort
    0
    • BluefoxB Offline
      BluefoxB Offline
      Bluefox
      schrieb am zuletzt editiert von
      #2

      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 Antwort Letzte Antwort
      0
      • E Offline
        E Offline
        erh_stgt
        schrieb am zuletzt editiert von
        #3

        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
        }
        
        

        Blutigster Anfänger übelster Sorte….

        1 Antwort Letzte Antwort
        0
        • S Offline
          S Offline
          steinwedel
          schrieb am zuletzt editiert von
          #4

          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 Antwort Letzte Antwort
          0
          • E Offline
            E Offline
            erh_stgt
            schrieb am zuletzt editiert von
            #5

            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…..


            Blutigster Anfänger übelster Sorte….

            1 Antwort Letzte Antwort
            0
            • E Offline
              E Offline
              erh_stgt
              schrieb am zuletzt editiert von
              #6

              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!


              Blutigster Anfänger übelster Sorte….

              1 Antwort Letzte Antwort
              0
              • BluefoxB Offline
                BluefoxB Offline
                Bluefox
                schrieb am zuletzt editiert von
                #7

                @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 Antwort Letzte Antwort
                0
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                639

                Online

                32.6k

                Benutzer

                82.2k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Anmelden

                • Du hast noch kein Konto? Registrieren

                • Anmelden oder registrieren, um zu suchen
                • Erster Beitrag
                  Letzter Beitrag
                0
                • Home
                • Aktuell
                • Tags
                • Ungelesen 0
                • Kategorien
                • Unreplied
                • Beliebt
                • GitHub
                • Docu
                • Hilfe