Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] JSON-Tabelle mit js.script triggern

    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

    [gelöst] JSON-Tabelle mit js.script triggern

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

      vielen Dank…

      werde ich dann mal testen 🙂

      1 Reply Last reply Reply Quote 0
      • S
        sveni_lee last edited by

        ich hab jetzt 2 Fehlermeldungen.

        Leider ist mein Javascript nicht besonders gut…

        ~~![](</s><URL url=)https://i.imgur.com/4YAGH7u.jpg" />

        ![](</s><URL url=)https://i.imgur.com/kQXMgy0.jpg" />~~

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

          Sorry, vor function() muss ein Komma anstelle der schließenden Klammer.

                sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
          
          
          1 Reply Last reply Reply Quote 0
          • S
            sveni_lee last edited by

            kein Problem,

            Danke für die schnelle Hilfe…

            Ich habe das Script jetzt mal getestet aber irgendwie wird die Bewässerungszeit nicht gesetzt.

            Ich habe gestern abend einen Terminn für heute früh gesetzt, weil ich gesehen hatte das Du einen Schedule

            täglich kurz nach 0:00Uhr gesetzt hast. Aber auch das hat nichts bewirkt.

            ich hätte auch noch eine anderen JSON-String...

            {"0":{"Bew1":{"wecken":false,"nachricht":0,"dauer":90,"stunde":5,"minute":25},"Bew2":{"wecken":false,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"1":{"Bew1":{"wecken":true,"nachricht":1,"dauer":90,"stunde":5,"minute":30},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"2":{"Bew1":{"wecken":true,"dauer":90,"nachricht":1,"stunde":5,"minute":"25"},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"3":{"Bew1":{"wecken":true,"nachricht":0,"dauer":90,"stunde":5,"minute":25},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"4":{"Bew1":{"wecken":true,"nachricht":0,"dauer":90,"stunde":5,"minute":25},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"5":{"Bew1":{"wecken":false,"nachricht":2,"dauer":5,"stunde":23,"minute":10},"Bew2":{"wecken":false,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}},"6":{"Bew1":{"wecken":true,"nachricht":2,"dauer":90,"stunde":9,"minute":0},"Bew2":{"wecken":true,"nachricht":"","dauer":0,"stunde":0,"minute":0},"Optionen":{"Active":true,"Option1":"","Option2":"","Option3":""}}}
            

            in diesem Fall sind keine Wochentage worhanden sondern nur 0-6…

            eventuell ist der ja leichter zu händeln...

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

              @sveni_lee:

              Ich habe das Script jetzt mal getestet aber irgendwie wird die Bewässerungszeit nicht gesetzt. `
              Dann füge mal Logs ein, um zu sehen, woran es hakt.

              const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan';
              const idBew = 'javascript.0.Bewässerung.Ventil1.LaufzeitVentil1';
              
              var debug = true;
              var sched1 = null;
              var sched2 = null;
              var json = getState(idJSON).val;
              
              function zeiten() {
                 var arr = JSON.parse(json);  // Array aus 7 Elementen (Wochentage)
                 var now = new Date();
                 var wd = now.getDay() - 1;  // Wochentag (0 = Montag)
                 if(wd < 0) wd = 6;  // Sonntag
                 if(debug) log('Wochentag: ' + wd);
                 var obj = arr[wd];
                 if(debug) log(JSON.stringify(obj));
                 if(sched1) clearSchedule(sched1);
                 if(debug) log('Active: ' + obj.Active + ' Typ: ' + typeof obj.Active);
                 if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time);
                 if(obj.Active == "true" && obj.Bew1_time) {  // ist Active ein String ?
                    var t = obj.Bew1.split(':');
                    sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                       setState(idBew, obj.Bew1_time);
                       if(debug) log('Bewässerung1 gestartet');
                    });
                 }
                 if(sched2) clearSchedule(sched2);     
                 if(obj.Active == "true" && obj.Bew2_time) {
                    t = obj.Bew2.split(':');
                    sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                       setState(idBew, obj.Bew1_time);
                    });
                 }
              }       
              
              zeiten();  // Skriptstart
              
              schedule('1 0 * * *', zeiten);  // kurz nach Mitternacht
              
              // Änderung des JSON-Strings
              on(idJSON, function(dp) {
                 json = dp.state.val;
                 zeiten();
              });
              
              

              EDIT: Fehlendes + korrigiert

              1 Reply Last reply Reply Quote 0
              • S
                sveni_lee last edited by

                so funktioniert jetzt… 😄

                ein Fehler habe ich gefunden:

                if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time);
                

                vor 'Minuten' fehlt ein +

                und das eigendiche Problem war hier

                if(obj.Active == "true" && obj.Bew1_time) {  // ist Active ein String ?
                

                und wenn richtig gelesen hätte wäre es mir auch aufgefallen. Active ist ein String also…

                if(obj.Active == "x" && obj.Bew1_time) {  // ist Active ein String ?
                

                und schon klappt es 🙂

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

                  @sveni_lee:

                  if(obj.Active == "x" && obj.Bew1_time) {  // ist Active ein String ?
                  ```` `  
                  

                  Dann habe ich dies falsch interpretiert:
                  @sveni_lee:

                  soll immer bewässert werden wenn, wenn Active=true ist und … `
                  Markiere bitte noch das Thema als gelöst (im Betreff des ersten Beitrags).

                  1 Reply Last reply Reply Quote 0
                  • S
                    sveni_lee last edited by

                    Ich hätte jetzt doch noch zwei Fragen zu dem Skript:

                    Ich habe nun 2 Kreisläufe die ich nun gern steuern möchte.

                    Kann ich das script einfach um eine Funktion bspw. Funktion zeiten_Ventil2() erweitern? Im grunde ist es der selbe Aufbau nur das

                    sich die beiden Konstanten ändern "const idJSON" und "const idBew"…

                    und ich würde mir gern anzeigen lassen, wann die nächste Bewesserung gestartet werden soll und für wie lange...

                    ist das auch irgendwie realisierbar?

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

                      @sveni_lee:

                      ich würde mir gern anzeigen lassen, wann die nächste Bewesserung gestartet werden soll und für wie lange… `
                      Dann ergänze das Skript um einen Datenpunkt (Typ Zeichenkette) für die Zeitanzeige.

                      const idZeit = 'javascript.0.Bewässerung.Ventil1.Zeitpunkt';
                      
                            setState(idZeit, obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten', true);
                            var t = obj.Bew1.split(':');
                            sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                               setState(idBew, obj.Bew1_time);
                               if(debug) log('Bewässerung1 gestartet');
                               if(obj.Bew2_time) setState(idZeit, obj.Bew2 + ' für ' + obj.Bew2_time + ' Minuten', true);
                            });
                      
                      

                      @sveni_lee:

                      Ich habe nun 2 Kreisläufe die ich nun gern steuern möchte.

                      Kann ich das script einfach um eine Funktion bspw. Funktion zeiten_Ventil2() erweitern? `
                      Das Skript einfach in ein zweites Skript kopieren und die 3 ID-Konstanten am Anfang ändern.

                      1 Reply Last reply Reply Quote 0
                      • S
                        sveni_lee last edited by

                        Danke, das klappt super…

                        ich hab jetzt noch Uhrzeit und dauer von einander getrennt...

                              setState(idZeit, obj.Bew1, true);
                              setState(idDauer, obj.Bew1_time + ' Minuten', true);
                        

                        Kann mann noch irgendwie den Wochentag dort mit reinbringen? Es kann ja vorkommen, das nicht jeden Tag bewässert wird.

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

                          @sveni_lee:

                          Kann mann noch irgendwie den Wochentag dort mit reinbringen? Es kann ja vorkommen, das nicht jeden Tag bewässert wird. `
                          Der Wochtentag als Zahl 0…6 liegt in der Variablen wd bereits vor. Durch Verwendung der Zahl als Index in ein Array, kann ein Name zugeordnet werden.

                          const days = ['Mo','Di','Mi','Do','Fr','Sa','So'];
                          
                          log('Wochentag: ' + days[wd]);
                          
                          1 Reply Last reply Reply Quote 0
                          • S
                            sveni_lee last edited by

                            Jepp… auch das klappt wunderbar...!

                            So langsam bekomme ich Ahnung wie man was realisieren kann.

                            Das Skript überprüft ja kurz nach Mitternacht ob für den dann aktuellen Tag was ansteht, das hat zur Folge, dass bis zum nächsten Tag als nächste Bewässerung immer noch die Zeit von heute angezeigt wird...

                            Gesendet von iPhone mit Tapatalk Pro

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

                              @sveni_lee:

                              Das Skript überprüft ja kurz nach Mitternacht ob für den dann aktuellen Tag was ansteht, das hat zur Folge, dass bis zum nächsten Tag als nächste Bewässerung immer noch die Zeit von heute angezeigt wird… `
                              Ja, oder

                                       if(obj.Bew2_time) setState(idZeit, obj.Bew2 + ' für ' + obj.Bew2_time + ' Minuten', true);
                                       else setState(idZeit, 'morgen oder später', true;
                              
                              
                              1 Reply Last reply Reply Quote 0
                              • S
                                sveni_lee last edited by

                                ich habe mich jetzt intensive damit auseinandergesetzt…

                                Mein Ziel ist/war es die Geplante nächste Bewässerung anzeigen zu lassen auch wenn sie erst in den nächsten Tagen geplant ist.

                                also habe ich das skript mit meinen bescheidenen Kenntnissen erweitert.

                                const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan';
                                const idBew = '';
                                const idZeit = 'javascript.0.Bewässerung.Ventil1.Zeitpunkt';
                                const idDauer = 'javascript.0.Bewässerung.Ventil1.Dauer_next';
                                const days = ['Mo','Di','Mi','Do','Fr','Sa','So'];
                                
                                var debug = true;
                                var sched1 = null;
                                var sched2 = null;
                                var json = getState(idJSON).val;
                                
                                function zeiten() {
                                   setState(idZeit, '--:--', true);   // default Anzeige falls keine Zeit gefunden wird
                                   setState(idDauer, ' nicht geplant', true);   // default Anzeife falls keine Zeit gefunden wird
                                   var arr = JSON.parse(json);  // Array aus 7 Elementen (Wochentage)
                                   var now = new Date();
                                   var wd = now.getDay() - 1;  // Wochentag (0 = Montag)
                                   if(wd < 0) wd = 6;  // Sonntag
                                   if(debug) log('Wochentag: ' + wd);
                                   var obj = arr[wd];
                                   if(debug) log(JSON.stringify(obj));
                                   if(sched1) clearSchedule(sched1);
                                   if(debug) log('Active: ' + obj.Active + ' Typ: ' + typeof obj.Active);
                                   if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time);
                                   var time = ("0" + now.getHours()).slice(-2)   + ":" + ("0" + now.getMinutes()).slice(-2);
                                   log('Zeit jetzt: ' + time); //nur für Testzwecke
                                   log(time < obj.Bew1); // nur für Testzwecke
                                   if(obj.Active == "x" && obj.Bew1_time && time < obj.Bew1) {  // ist Active ein String ?
                                      setState(idZeit, days[wd] + '. ' + obj.Bew1, true);
                                      setState(idDauer, obj.Bew1_time + ' Minuten', true);
                                      var t = obj.Bew1.split(':');
                                      sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                                         setState(idBew, obj.Bew1_time);
                                         if(debug) log('Bewässerung1 gestartet');
                                      });
                                   }
                                   if(sched2) clearSchedule(sched2);     
                                   if(obj.Active == "x" && obj.Bew2_time && time < obj.Bew2) {
                                      setState(idZeit, days[wd] + '. ' + obj.Bew2, true);
                                      setState(idDauer, obj.Bew2_time + ' Minuten', true);
                                      t = obj.Bew2.split(':');
                                      sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                                         setState(idBew, obj.Bew2_time);
                                      });
                                   }
                                   else 
                                      for (i=1; i<=7; i++) {
                                          wd = wd + 1
                                          if(wd>6) wd = 0; //umschalten Sonntag auf Montag
                                          obj = arr[wd];
                                          if(obj.Active == "x" && obj.Bew1_time) {
                                             setState(idZeit, days[wd] + '. ' + obj.Bew1, true);
                                             setState(idDauer, obj.Bew1_time + ' Minuten', true);
                                             break;
                                          }
                                          else
                                             if(obj.Active == "x" && obj.Bew2_time) {
                                                setState(idZeit, days[wd] + '. ' + obj.Bew2, true);
                                                setState(idDauer, obj.Bew2_time + ' Minuten', true);
                                                break;
                                             }
                                      }
                                }       
                                
                                zeiten();  // Skriptstart
                                
                                schedule('1 0 * * *', zeiten);  // kurz nach Mitternacht
                                
                                // Änderung des JSON-Strings
                                on(idJSON, function(dp) {
                                   json = dp.state.val;
                                   zeiten();
                                });
                                

                                das klappt auch mit einer Ausnahme. Ich habe für heute eine Bew. für 19:25 eingetragen aber diese wird mir nicht angezeigt als nächste

                                Bewässerung. Ich habe sicher irgendwo einen Fehler aber ich finde ihn einfach nicht…

                                EDIT:

                                hab's gelöst.... klappt jetzt... musste noch ein wenig mit dem "if" und "else if" Konditionen spielen

                                const idJSON = 'javascript.0.Bewässerung.Ventil_1.BewaesserungsPlan';
                                const idBew = '';
                                const idZeit = 'javascript.0.Bewässerung.Ventil1.Zeitpunkt';
                                const idDauer = 'javascript.0.Bewässerung.Ventil1.Dauer_next';
                                const days = ['Mo','Di','Mi','Do','Fr','Sa','So'];
                                
                                var debug = true;
                                var sched1 = null;
                                var sched2 = null;
                                var json = getState(idJSON).val;
                                
                                function zeiten() {
                                   setState(idZeit, '--:--', true);   // default Anzeige falls keine Zeit gefunden wird
                                   setState(idDauer, ' nicht geplant', true);   // default Anzeife falls keine Zeit gefunden wird
                                   var t = 0;
                                   var arr = JSON.parse(json);  // Array aus 7 Elementen (Wochentage)
                                   var now = new Date();
                                   var wd = now.getDay() - 1;  // Wochentag (0 = Montag)
                                   if(wd < 0) wd = 6;  // Sonntag
                                   if(debug) log('Wochentag: ' + wd);
                                   var obj = arr[wd];
                                   if(debug) log(JSON.stringify(obj));
                                   if(sched1) clearSchedule(sched1);
                                   if(debug) log('Active: ' + obj.Active + ' Typ: ' + typeof obj.Active);
                                   if(debug) log('Bew1 um: ' + obj.Bew1 + ' für ' + obj.Bew1_time + ' Minuten ' + ' Typ: ' + typeof obj.Bew1_time);
                                   var time = ("0" + now.getHours()).slice(-2)   + ":" + ("0" + now.getMinutes()).slice(-2);
                                   log('Zeit jetzt: ' + time); //nur für Testzwecke
                                   log(time < obj.Bew1); // nur für Testzwecke
                                   if(obj.Active == "x" && obj.Bew1_time && time < obj.Bew1) {  // ist Active ein String ?
                                      setState(idZeit, days[wd] + '. ' + obj.Bew1, true);
                                      setState(idDauer, obj.Bew1_time + ' Minuten', true);
                                      t = obj.Bew1.split(':');
                                      sched1 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                                         setState(idBew, obj.Bew1_time);
                                         if(debug) log('Bewässerung1 gestartet');
                                      });
                                   }
                                   if(sched2) clearSchedule(sched2);     
                                   if(obj.Active == "x" && obj.Bew2_time && time < obj.Bew2 && (obj.Bew1_time === 0 || time > obj.Bew1)) {
                                      setState(idZeit, days[wd] + '. ' + obj.Bew2, true);
                                      setState(idDauer, obj.Bew2_time + ' Minuten', true);
                                      t = obj.Bew2.split(':');
                                      sched2 = schedule(t[1] + ' ' + t[0] + ' * * *', function() {
                                         setState(idBew, obj.Bew2_time);
                                      });
                                   }
                                   else if (t===0) 
                                      for (i=1; i<=7; i++) {
                                          wd = wd + 1;
                                          if(wd>6) wd = 0; //umschalten Sonntag auf Montag
                                          obj = arr[wd];
                                          if(obj.Active == "x" && obj.Bew1_time) {
                                             setState(idZeit, days[wd] + '. ' + obj.Bew1, true);
                                             setState(idDauer, obj.Bew1_time + ' Minuten', true);
                                             break;
                                          }
                                          else
                                             if(obj.Active == "x" && obj.Bew2_time) {
                                                setState(idZeit, days[wd] + '. ' + obj.Bew2, true);
                                                setState(idDauer, obj.Bew2_time + ' Minuten', true);
                                                break;
                                             }
                                      }
                                }       
                                
                                zeiten();  // Skriptstart
                                
                                schedule('1 0 * * *', zeiten);  // kurz nach Mitternacht
                                
                                // Änderung des JSON-Strings
                                on(idJSON, function(dp) {
                                   json = dp.state.val;
                                   zeiten();
                                });
                                
                                1 Reply Last reply Reply Quote 0
                                • BuZZy
                                  BuZZy last edited by

                                  Hallo,

                                  hoffe es ist in Ordnung wenn ich hier mal frage welches Ventil du verwendest? Bin mir noch unschlüssig welches elektrische Ventil ich kaufen soll um eine Wasserleitung zu öffnen bzw zu schließen..

                                  Danke und Gruß

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    sveni_lee last edited by

                                    Klar… ich beende Hunter 1 1/4 Zoll Ventile 9v.

                                    Die werden mit einem Hutschienen Trafo versorgt...

                                    Gesendet von iPhone mit Tapatalk Pro

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      sveni_lee last edited by

                                      so, nachdem ich das script nun einige Tage testen konnte, ist doch noch ein kleines Problem aufgetaucht.

                                      Ich habe für meine beiden Bewässerungskreisläufe jeweils ein script zu laufen. Nun wollte benötige ich die

                                      Möglichkeit die scripte via Widget zu starten und zu stoppen. und zwar mit bei scripts mit nur einem Schalter.

                                      es gibt zwar die möglichkeit ein script via "scriptEnabled.common.Bewaesserung.Timestamp_Ventil1" zu starten und zu stoppen

                                      aber das klappt nicht aus einen script heraus um zwei Scripte (scriptEnabled.common.Bewaesserung.Timestamp_Ventil1 + scriptEnabled.common.Bewaesserung.Timestamp_Ventil2) zu "schalten"

                                      also wollte ich das die Funktion innerhalb des Scripts nur bei eingeschaltetem Datenpunkt läuft

                                      on({id: "javascript.0.Bewässerung.Trigger_Semi_Automatic"/*Trigger_Semi_Automatic*/, val: true}, function (obj) {
                                      
                                          zeiten();  // Skriptstart
                                      
                                          schedule('1 0 * * *', zeiten);  // kurz nach Mitternacht
                                      
                                          // Änderung des JSON-Strings
                                         on(idJSON, function(dp) {
                                            json = dp.state.val;
                                            zeiten();
                                          });
                                      });
                                      

                                      die Funktion Zeiten wird aber nun auch ausgeführt wernn der Datenpunkt "javascript.0.Bewässerung.Trigger_Semi_Automatic" auf false steht.

                                      hab ich noch irgendetwas falsch verstanden?

                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      845
                                      Online

                                      31.7k
                                      Users

                                      79.9k
                                      Topics

                                      1.3m
                                      Posts

                                      3
                                      23
                                      1622
                                      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