Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Fehler in Scripte die schon funktionierten!!!

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Fehler in Scripte die schon funktionierten!!!

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

      Da muss man Skript ansehen. Anscheinend machst du irgendwas mit Werten von Variablen und es kann gut sein, dass bei bestimmten Werten Skript nicht mehr geht.

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

        @webseb79:

        Bei Javascript habe ich noch suncalc , dewpoint , pi-controller installiert. `
        suncalc ist bereits mit dem Javascript-Adapter installiert und braucht (sollte) nicht nochmal installiert werden.

        1 Reply Last reply Reply Quote 0
        • W
          webseb79 last edited by

          Hier mal die Scripte:

          Sonnenstandsberechnung

          /* System Sonnenstand
          
          Sonne Azimut und Elevation in Variablen schreiben
          
          erstellt: 06.07.2015 nach ioBroker Forum http://forum.iobroker.net/viewtopic.php?f=21&t=975&sid=6f0ba055de5f82eed6809424f49ca93b#p7635
          */
          var suncalc = require('suncalc'),
              result = getObject("system.adapter.javascript.0"),
              lat = result.native.latitude,
              long = result.native.longitude;
          
          createState('Sonnenstand.Elevation', 0, {unit: '°'});
          createState('Sonnenstand.Azimut', 0, {unit: '°'});
          
          function Sonnenstand_berechnen () {
              var now = new Date();
              var sunpos = suncalc.getPosition(now, lat, long);
              var h = sunpos.altitude * 180 / Math.PI,
                  a = sunpos.azimuth * 180 / Math.PI + 180;
          
              setState("javascript.0.Sonnenstand.Elevation",h.toFixed(1));
              setState("javascript.0.Sonnenstand.Azimut",a.toFixed());
          }
          
          schedule("*/3 * * * *", Sonnenstand_berechnen);
          Sonnenstand_berechnen(); // bei Scriptstart
          

          Sonnenschutz Badezimmer:

          on({
              id: "javascript.0.Sonnenstand.Elevation"/*Sonnenstand.Elevation*/,
              change: "ne",
              logic: "and"
          }, function (obj) {
              Sonnenschutz_ausfuehren();
          });
          
          function Sonnenschutz_ausfuehren() 
          {
              if (getState("hm-rpc.0.LEQ1028794.1.LEVEL"/*Bad Jalousie Fenster:1.LEVEL*/).val <= 90) { return; }
                  if (getState("javascript.0.Sonnenstand.Azimut"/*Sonnenstand.Azimut*/).val >= 145 && getState("javascript.0.Sonnenstand.Azimut"/*Sonnenstand.Azimut*/).val <= 289) {
                      if (getState("javascript.0.Beschattung.Jalousien.Sonnenschutz"/*javascript.0.Beschattung.Jalousien.Sonnenschutz*/).val === true) {
                              toLog("Sonnenschutzposition Jalousie Badezimmer angefahren",true);
                              setStateDelayed("hm-rpc.0.LEQ1028794.1.LEVEL"/*Bad Jalousie Fenster:1.LEVEL*/,40,15000);
                      }
                  }
          }
          
          on({
              id: "javascript.0.Sonnenstand.Elevation"/*Sonnenstand.Elevation*/,
              change: "ne",
              logic: "and"
          }, function (obj) {
              Sonnenschutz_aufheben();
          });
          
          function Sonnenschutz_aufheben() 
          {
              if (getState("hm-rpc.0.LEQ1028794.1.LEVEL"/*Bad Jalousie Fenster:1.LEVEL*/).val <= 10 || getState("hm-rpc.0.LEQ1028794.1.LEVEL"/*Bad Jalousie Fenster:1.LEVEL*/).val >= 90) { return; }
                  if (getState("javascript.0.Sonnenstand.Azimut"/*Sonnenstand.Azimut*/).val >= 290) {
                          toLog("Sonnenschutzposition Jalousie Badezimmer verlassen",true);
                          setState("hm-rpc.0.LEQ1028794.1.LEVEL"/*Bad Jalousie Fenster:1.LEVEL*/,100);
          
                  }
          }
          
          

          Sonnenschutz rpüfen:

          //--------------------Sonnenschutz prüfen---------------------------------------
          on({
              id: "javascript.0.Sonnenstand.Elevation"/*Sonnenstand.Elevation*/,
              change: "ne",
              logic: "and"
          }, function (obj) {
              Sonnenschutz_pruefen();
          });
          
          createState("javascript.0.Beschattung.Jalousien.Sonnenschutz", false);
          createState("javascript.0.Beschattung.Jalousien.Aktiv", false);
          
          function Sonnenschutz_pruefen() {
              var SunProtect = false;
              if (getState("javascript.0.Sonnenstand.Elevation"/*Sonnenstand.Elevation*/).val >= 5) {
                  if (getState("javascript.0.Sonnenstand.Azimut"/*Sonnenstand.Azimut*/).val >= 100 && getState("javascript.0.Sonnenstand.Azimut"/*Sonnenstand.Azimut*/).val <= 300) {
                      if (getState("javascript.0.Aussentemperatur.Anpassung"/*Aussentemperatur.Anpassung*/).val >= 19 && getState("javascript.0.Aussentemperatur.Anpassung"/*Aussentemperatur.Anpassung*/).val <= 30) {
                          if (getState("javascript.0.Beschattung.Sonnensensor.Sonne"/*javascript.0.Beschattung.Sonnensensor.Sonne*/).val === true && getState("hm-rpc.0.MEQ0203583.3.TEMPERATURE"/*Sonnensensor:3.TEMPERATURE*/).val >= 1.0) {
                              if (getState("javascript.0.Beschattung.Jalousien.Aktiv").val === true){
                              SunProtect = true;
                              }
                          }
                      }
                  }
              }
              if (getState("javascript.0.Beschattung.Jalousien.Sonnenschutz").val != SunProtect) {
                  // Nur bei Änderung setzen
                  //setState("hm-rega.0.8091"/*Jalousie Sonnenschutz*/, SunProtect);
                  setState("javascript.0.Beschattung.Jalousien.Sonnenschutz", SunProtect);
                  //log("Prüfe Sonnenschutz: " + SunProtect);
              }
          }
          
          // Sonnenschutz wurde aktiviert
          on({
              id: "javascript.0.Beschattung.Jalousien.Sonnenschutz",
              change: "ne",
              val: true,
              logic: "and"
          }, function (obj) {
              Sonnenschutz_ein();
          });
          
          function Sonnenschutz_ein() {
          
              toLog("Der Sonnenschutz global wurde aktiviert",true);
          }
          
          // Sonnenschutz wurde deaktiviert
          on({
              id: "javascript.0.Beschattung.Jalousien.Sonnenschutz",
              change: "ne",
              val: false,
              logic: "and"
          }, function (obj) {
              Sonnenschutz_aus();
          });
          
          on({
              id: "javascript.0.Beschattung.Jalousien.Aktiv",
              change: "ne",
              val: false,
              logic: "and"
          }, function (obj) {
              Sonnenschutz_aus();
          });
          
          on({
              id: "javascript.0.Beschattung.Jalousien.Hitzeschutz",
              change: "ne",
              val: true,
              logic: "and"
          }, function (obj) {
              Sonnenschutz_aus();
          });
          
          function Sonnenschutz_aus() {
          
              toLog("Der Sonnenschutz global wurde deaktiviert",true);
          }
          
          

          Das sind z.B. drei Scripte die zusammen arbeiten.

          Durch Sonne Elevation wird getriggert , Sonnenschutz nach Kriterien prüfen , Sonnenschutz im Badezimmer ausführen.

          Hoffe es ist verständlich.

          Gruß Sebastian

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

            createState('Sonnenstand.Elevation', 0, {unit: '°'});
            

            hat den Datenpunkt in der Instanz "javascript.0" angelegt ?

            error   hm-rpc.0.LEQ1174762.1.STATE [object Object] Cannot read property 'push' of undefined
            

            Der Datenpunkt "hm-rpc.0.LEQ1174762.1.STATE" taucht in den Skripten nicht auf. Woher kommt eine property 'push' ?

            Schau Dir im Reiter "Objekte" die Eigenschaften des betreffenden Datenpunktes an.

            Ersetze bitte

                setState("javascript.0.Sonnenstand.Elevation",h.toFixed(1));
                setState("javascript.0.Sonnenstand.Azimut",a.toFixed());
            
            

            durch

                setState("javascript.0.Sonnenstand.Elevation", Math.round(10 * h) / 10);
                setState("javascript.0.Sonnenstand.Azimut", Math.round(a));
            
            
            1 Reply Last reply Reply Quote 0
            • W
              webseb79 last edited by

              Hallo paul53,

              der Datenpunkt wurde angelegt.

              Habe deinen Vorschlag im Script geändert.

              Der Datenpunkt "hm-rpc.0.LEQ1174762.1.STATE" ist vorhanden…hat sich gerade dazwichen gedrängelt...kommt in einem anderen Script vor.

              Der Fehler ist wieder aufgetreten.

              Die Sonnenstandsberechnung funktioniert ja...aber als Trigger in anderen Scripten kommt es dann zum Fehler

              javascript.0	2016-06-22 17:39:00.643	error	TypeError: Cannot read property 'split' of undefined at toLog (script.js.Veranda.Jalousie_G_Sonnenschutz:143:18) at Sonnenschutz_ausfuehren (script.js.Veranda.Jalousie_G_Sonnenschutz:244:21)
              javascript.0	2016-06-22 17:39:00.643	error	message javascript.0.Sonnenstand.Elevation [object Object] Cannot read property 'split' of undefined
              

              Z.B im Logdatenscript kommt das Wort 'split' ja vor.

              createState('Logdatenerstellung.Log', '');
              
              function getTimeAsString(d) {
                  var date = d || new Date();
                  return date.getFullYear() + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + ('0' + date.getDate()).slice(-2) + '  ---   '+
               ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + ':' +  ('0' + date.getSeconds()).slice(-2);    
              }
              function toLog(text, addTimestamp) 
              {
                  console.log(text);
                  var lines = getState('Logdatenerstellung.Log').val;
                  lines = lines.split('
              ');
                  if (addTimestamp) {
                          lines.push(getTimeAsString() + '  ---  ' + text);
                  } else {
                          lines.push(text);
                  }
                  if (lines.length > 33) lines.splice(0,1);
                  setState('Logdatenerstellung.Log', lines.join('
              '), true);
              }
              

              Kann da der Fehler sein?

              Sebastian

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

                @webseb79:

                Kann da der Fehler sein? `
                Ja. Mit

                    setState('Logdatenerstellung.Log', lines.join('
                '), true);
                

                soll ein Array in einen Datenpunkt geschrieben werden, was nicht funktioniert. Das Array müsste erst in einen String gewandelt werden.

                    var lines = getState('Logdatenerstellung.Log').val;
                    lines = lines.split('
                ');
                

                erwartet einen String im Datenpunkt und macht daraus ein Array. Da aber kein String geschrieben wurde, kann split nicht funktionieren.

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

                  Muss mich korrigieren:

                  lines.join('
                  ')
                  

                  macht aus dem Array einen String mit Zeilentrenner.

                  Vielleicht muss man den Datenpunkt 'Logdatenerstellung.Log' erst einmal mit einem einfachen String initialisieren ?

                  Wie sieht der Datenpunkt (Wert) jetzt aus ?

                  1 Reply Last reply Reply Quote 0
                  • W
                    webseb79 last edited by

                    Also ganz kann ich dir leider nicht mehr folgen in Punkto String und Array…bin gerade dabei mich zu belesen.

                    Unter Zustande steht kein Wert geschrieben.

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

                      @webseb79:

                      Unter Zustande steht kein Wert geschrieben. `
                      Dann gib mal einen kurzen Text ein, z.B. startlog.

                      1 Reply Last reply Reply Quote 0
                      • W
                        webseb79 last edited by

                        Habe das Script für Logdatenerfassung erstmal gestoppt und in alle anderen Scripten das "toLog" auskommentiert.

                        Jetzt funktioniert z.B meine Beschattung wieder.

                        Wo soll ich startlog eingeben?

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

                          @webseb79:

                          Wo soll ich startlog eingeben? `
                          Im Reiter Zustände auf den Datenpunkt 'Logdatenerstellung.Log' doppelklicken und im Feld Wert den Text eingeben.

                          1 Reply Last reply Reply Quote 0
                          • W
                            webseb79 last edited by

                            Schlechte Nachricht…

                            Jetzt ist mein System komplett abgeschmiert....werde erstmal wieder zurück auf Raspi umstellen und mein Backup auf den Cubox einspielen.

                            Probiere dann dein Eintrag unter Zustände.

                            Wird ein weilchen dauern , würde mich morgen mit meinen Ergebnissen melden.

                            Danke erstmal paul53 für deine Hilfe.

                            Schönen Abend

                            Sebastian

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            617
                            Online

                            31.7k
                            Users

                            79.7k
                            Topics

                            1.3m
                            Posts

                            3
                            13
                            2114
                            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