Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Länge/Breite in Javascript Adapter einbinden

    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

    Länge/Breite in Javascript Adapter einbinden

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

      @pix:

      ich hatte schon hier gefragt: Wie kann ich die geografische Breite und Länge, die in den JavaScript Adapter Einstellungen hinterlegt sind im Skript verwenden? `
      Du hattest http://forum.iobroker.org/viewtopic.php?f=21&t=975#p7638 bereits die Lösung 🙂

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Gleich noch eine Frage hinterher:

        Wie kann ich in Zeile eins die richtige Javascript Instanz auswählen (hier: system.adapter.javascript.2), je nachdem, wo das Skript läuft? Gibt es sowas wie system.adapter.javascript.aktuell?

        var geo = getObject('system.adapter.javascript.2'); // <---- richtige Instanz eintragen
        if (geo && geo.native) {
            breite = geo.native.latitude;
            laenge = geo.native.longitude;
            if (logging) log('Spritpreis - Geokoordinaten aus Javascript-Adapter gelesen');
        } else { // falls nicht in den Adaptereinstellungen festgelegt, manuelle Werte
            breite = '48';
            laenge = '11';
            if (logging) log('Spritpreis - Geokoordinaten manuell eingetragen');
        }
        

        @ Paul: Habe ich glatt vergessen! :roll:

        Gruß

        Pix

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

          @pix:

          Wie kann ich in Zeile eins die richtige Javascript Instanz auswählen (hier: system.adapter.javascript.2), je nachdem, wo das Skript läuft? Gibt es sowas wie system.adapter.javascript.aktuell? `
          So könnte man die aktuelle Instanz ermitteln:

          var logging = true;
          
          createState("CheckInstance");
          
          var breite;
          var laenge;
          
          var timerID = setTimeout(function() {
              var dpID = getIdByName("CheckInstance");
              var inst = dpID.substr(0,12);
              if (logging) log("aktuelle Instanz: " + inst);
              var geo = getObject("system.adapter." + inst);
              if (geo && geo.native) {
              breite = geo.native.latitude;
              laenge = geo.native.longitude;
              if (logging) log('Spritpreis - Geokoordinaten aus Javascript-Adapter gelesen');
              } else { // falls nicht in den Adaptereinstellungen festgelegt, manuelle Werte
              breite = '48';
              laenge = '11';
              if (logging) log('Spritpreis - Geokoordinaten manuell eingetragen');
          }
          
              clearTimeout(timerID);
              // hier sollte der DP "CheckInstance" gelöscht werden, aber wie ?
          }, 1000);
          
          

          Da ich nicht weiß, wie man ein Objekt aus Javascript heraus löscht, muss man das Objekt "CheckInstance" manuell löschen, um das Verfahren mehrfach anwenden zu können.

          1 Reply Last reply Reply Quote 0
          • P
            pix last edited by

            Hallo Paul,
            @paul53:

            So könnte man die aktuelle Instanz ermitteln:

            var logging = true;
            
            createState("CheckInstance");
            
            var breite;
            var laenge;
            
            var timerID = setTimeout(function() {
                var dpID = getIdByName("CheckInstance");
                var inst = dpID.substr(0,12);
                if (logging) log("aktuelle Instanz: " + inst);
                var geo = getObject("system.adapter." + inst);
                if (geo && geo.native) {
                breite = geo.native.latitude;
                laenge = geo.native.longitude;
                if (logging) log('Spritpreis - Geokoordinaten aus Javascript-Adapter gelesen');
                } else { // falls nicht in den Adaptereinstellungen festgelegt, manuelle Werte
                breite = '48';
                laenge = '11';
                if (logging) log('Spritpreis - Geokoordinaten manuell eingetragen');
            }
            
                clearTimeout(timerID);
                // hier sollte der DP "CheckInstance" gelöscht werden, aber wie ?
            }, 1000);
            
            

            Da ich nicht weiß, wie man ein Objekt aus Javascript heraus löscht, muss man das Objekt "CheckInstance" manuell löschen, um das Verfahren mehrfach anwenden zu können. `

            Danke für die Hilfe. getIdByName liefert bei mir kein Ergebnis ('undefined').

            createState('Sprit.billigste_Tankstelle.json', {name: 'Billigste Tankstelle - JSON'});
            var dpID = getIdByName("Sprit.billigste_Tankstelle.json");
            if (logging) log('DP ID' + dpID);
            var teile = dpID.split('.');
            var instanz = teile[3];
            if (logging) log('Instanz: system.adapter.javascript.' + instanz);
            

            Warum erst CheckInstance anlegen und dann wieder löschen? Ich kann doch gleich eines der Objekte nehmen, die eh angelegt werden. Weiterhin habe ich statt substr dann split verwendet. Es teilt den String bei einem vordefinierten Zeichen (in diesem Fall der Punkt) und schreibt die Teile in ein Array. Aus diesem Array nehme ich das vierte Teil ([3]). Leider läuft das nicht, da

            error: javascript.2 script.js.VIS_Spritpreis_billigsteTankstelle: TypeError: Cannot call method 'split' of undefined
                at script.js.VIS_Spritpreis_billigsteTankstelle:70:18
            

            Gruß

            Pix

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

              @pix:

              getIdByName liefert bei mir kein Ergebnis ('undefined'). `
              Verwendest Du die aktuelle Version (0.5.5) von iobroker.javascript ?

              Das Script habe ich bei mir erfolgreich getestet (iobroker unter Win 7).
              @pix:

              Warum erst CheckInstance anlegen und dann wieder löschen? Ich kann doch gleich eines der Objekte nehmen, die eh angelegt werden. `
              Ja, kannst Du natürlich. Allerdings funktioniert getIdByName() nur richtig, wenn man eindeutige Namen verwendet, also in jeder Instanz einen anderen Namen.
              @pix:

              createState('Sprit.billigste_Tankstelle.json', {name: 'Billigste Tankstelle - JSON'});

              var dpID = getIdByName("Sprit.billigste_Tankstelle.json"); `
              Das sofortige Abfragen nach createState() funktioniert nicht, deshalb das Timeout.

              Der Name ist explizit vorgegeben "{name: 'Billigste Tankstelle - JSON'}", also muss wohl auch getIdByName() darauf angewendet werden ?:

              var dpID = getIdByName("Billigste Tankstelle - JSON");
              

              2562_22.png

              1 Reply Last reply Reply Quote 0
              • P
                pix last edited by

                Hallo Paul,@paul53:

                @pix:

                getIdByName liefert bei mir kein Ergebnis ('undefined'). Verwendest Du die aktuelle Version (0.5.5) von iobroker.javascript ?
                ja~~@paul53:~~

                Das sofortige Abfragen nach createState() funktioniert nicht, deshalb das Timeout. `
                Aha, das timeout hatte mich schon gewundert.@paul53:

                Der Name ist explizit vorgegeben "{name: 'Billigste Tankstelle - JSON'}", also muss wohl auch getIdByName() darauf angewendet werden ?:

                var dpID = getIdByName("Billigste Tankstelle - JSON");
                ```` `  Das war der entscheidende Tipp - jetzt gehts.
                

                Danke und Gruß

                Pix

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

                  @paul53:

                  @pix:

                  Wie kann ich in Zeile eins die richtige Javascript Instanz auswählen (hier: system.adapter.javascript.2), je nachdem, wo das Skript läuft? Gibt es sowas wie system.adapter.javascript.aktuell? `
                  So könnte man die aktuelle Instanz ermitteln:

                  var logging = true;
                  
                  var breite;
                  var laenge;
                  
                  var timerID = setTimeout(function() {
                      var dpID = getIdByName("CheckInstance");
                      var inst = dpID.substr(0,12);
                      if (logging) log("aktuelle Instanz: " + inst);
                      var geo = getObject("system.adapter." + inst);
                      if (geo && geo.native) {
                      breite = geo.native.latitude;
                      laenge = geo.native.longitude;
                      if (logging) log('Spritpreis - Geokoordinaten aus Javascript-Adapter gelesen');
                      } else { // falls nicht in den Adaptereinstellungen festgelegt, manuelle Werte
                      breite = '48';
                      laenge = '11';
                      if (logging) log('Spritpreis - Geokoordinaten manuell eingetragen');
                  }
                  
                      clearTimeout(timerID);
                      // hier sollte der DP "CheckInstance" gelöscht werden, aber wie ?
                  }, 1000);
                  
                  

                  Da ich nicht weiß, wie man ein Objekt aus Javascript heraus löscht, muss man das Objekt "CheckInstance" manuell löschen, um das Verfahren mehrfach anwenden zu können. `
                  Ich würde nie drauf kommen, so das Problem zu lösen :lol: Cool.

                  Währe es nicht einfache getInstance Funktion zu implementieren und pull request zu machen?

                  Du bist doch fit in JS. :!:

                  P.S. timeout braucht man nicht unbedingt.

                  
                  var breite;
                  var laenge;
                  
                  function getPosition () {
                      var dpID = getIdByName("CheckInstance");
                      var inst = dpID.substr(0,12);
                      if (logging) log("aktuelle Instanz: " + inst);
                      var geo = getObject("system.adapter." + inst);
                      if (geo && geo.native) {
                      breite = geo.native.latitude;
                      laenge = geo.native.longitude;
                      if (logging) log('Spritpreis - Geokoordinaten aus Javascript-Adapter gelesen');
                      } else { // falls nicht in den Adaptereinstellungen festgelegt, manuelle Werte
                      breite = '48';
                      laenge = '11';
                      if (logging) log('Spritpreis - Geokoordinaten manuell eingetragen');
                  }
                  
                  createState("CheckInstance", getPosition);
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @Bluefox:

                    Währe es nicht einfache getInstance Funktion zu implementieren und pull request zu machen?

                    Du bist doch fit in JS. `
                    Nein, ich arbeite mich gerade erst in JS ein. Was ist ein pull request ?
                    @Bluefox:

                    P.S. timeout braucht man nicht unbedingt. `
                    Die Möglichkeit mit

                    createState(name, callback);
                    

                    habe ich übersehen.

                    Ist das createState(name) am Script-Ende erforderlich ?

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

                      GELÖSCHT

                      erst denken, dann schreiben… 😉

                      Die Idee mit RegExp war dumm 😞

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

                        @paul53:

                        Nein, ich arbeite mich gerade erst in JS ein. Was ist ein pull request ? `
                        1. Du machst ein Account auf github

                        2. Machst fork von https://github.com/ioBroker/ioBroker.javascript

                        3. Dann machst du die Änderungen an dem Projekt (online oder "lokal und dann push") und dann

                        4. drückst du auf "pull request" Knopf und bietest deine Änderungen in den Hauptzweig zu mergen.

                        @paul53:

                        Ist das createState(name) am Script-Ende erforderlich ? `
                        Habe korrigiert 🙂

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

                          @ruhr70:

                          kann man bei getObject nicht auch mit RegExp arbeiten? `
                          Nein. Weil du genau wissen solltest, was du nimmst.

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

                            @Bluefox:

                            @ruhr70:

                            kann man bei getObject nicht auch mit RegExp arbeiten? Nein. Weil du genau wissen solltest, was du nimmst.

                            Verdammt bist Du schnell…

                            ich hatte es schon gelöscht und dann kam Deine Antwort.

                            Ja, ist logisch... ich muss ja nicht irgendeine Instanz haben, sondern genau die Richtige.
                            4874_dwdexpand.txt

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

                              Bevor ich Änderungen auf GitHub vornehme, muss ich Deinen Code erst einmal (nahezu vollständig) verstehen. Davon bin ich noch weit entfernt.

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

                                Zum Thema: Ermitteln der Javascript-Instanz, unter dem das Script aktuell läuft

                                Ich habe nichts gefunden, ob es da mittlerweile eine andere Alternative gibt.

                                Aus den Posts oben habe ich mir eine globale Function erstellt, anhand der ich mir im Script die aktuelle Javascript-Instanz zurückgeben lasse. Danke für die Anregungen.

                                // globale Funktion:    getJSInstance()
                                
                                // Beschreibung:        Ermittelt die aktuelle Javascript-Instanz und gibt diese als String zurück            
                                
                                // Übergabeparameter:   keine
                                // Rückgabe:            aktuelle Javascript Instanz als String
                                
                                // Infos:               legt den Datenpunkt "CheckInstance" in der aktiven Javascript-Instanz an
                                
                                function getJSInstanceDP () {
                                    return getIdByName("CheckInstance").substr(0,12);
                                }
                                
                                function getJSInstance () {
                                    createState("CheckInstance", getJSInstanceDP);
                                    setState("CheckInstance", getJSInstanceDP);
                                    return getJSInstanceDP();
                                    }
                                
                                

                                Wenn jemand mehr als 10 Javascript Instanzen startet, habe ich das nicht berücksichtigt 😉

                                Der Aufruf der Funktion getJSInstance() gibt dann z.B. "javascript.0" zurück.

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

                                  Ich habe hier leider noch das übliche Problem.

                                  Beim ersten Start eines Scripts, welches die Funktion verwendet, kommt der Fehler, das der Datenpunkt CheckInstance noch nicht definiert ist.

                                  Ab dem zweiten Start läuft es dann sauber.

                                  Gibt es eine Möglichkeit, dass in der globalen Funktion abzufangen?

                                  Ich möchte eine globale Funktion so narrensicher wie möglich realisieren.

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

                                    @ruhr70:

                                    Zum Thema: Ermitteln der Javascript-Instanz, unter dem das Script aktuell läuft

                                    Ich habe nichts gefunden, ob es da mittlerweile eine andere Alternative gibt.

                                    Aus den Posts oben habe ich mir eine globale Function erstellt, anhand der ich mir im Script die aktuelle Javascript-Instanz zurückgeben lasse. Danke für die Anregungen.

                                    // globale Funktion:    getJSInstance()
                                    
                                    // Beschreibung:        Ermittelt die aktuelle Javascript-Instanz und gibt diese als String zurück            
                                    
                                    // Übergabeparameter:   keine
                                    // Rückgabe:            aktuelle Javascript Instanz als String
                                    
                                    // Infos:               legt den Datenpunkt "CheckInstance" in der aktiven Javascript-Instanz an
                                    
                                    function getJSInstanceDP () {
                                        return getIdByName("CheckInstance").substr(0,12);
                                    }
                                    
                                    function getJSInstance () {
                                        createState("CheckInstance", getJSInstanceDP);
                                        setState("CheckInstance", getJSInstanceDP);
                                        return getJSInstanceDP();
                                        }
                                     
                                    
                                    

                                    Wenn jemand mehr als 10 Javascript Instanzen startet, habe ich das nicht berücksichtigt 😉

                                    Der Aufruf der Funktion getJSInstance() gibt dann z.B. "javascript.0" zurück. `
                                    Und das alles nur dafür um kein Pull Request auf github zu machen. 😄

                                    Es ist sehr einfach die Info zugreifbar zu machen . Ich muss nur wissendass es nötig ist. 😄

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

                                      @Bluefox:

                                      Und das alles nur dafür um kein Pull Request auf github zu machen. 😄

                                      Es ist sehr einfach die Info zugreifbar zu machen . Ich muss nur wissendass es nötig ist. 😄 `

                                      Na ja…

                                      2.500 Zeilen Code...

                                      Dann wüsste ich nicht, wie man das sauber in dem Adapter umsetzt.

                                      Und github/pull Request sind auch so Themen, mit denen ich sonst nichts zu tun habe.

                                      Programmierung kenne ich noch als Maschinencode und Assambler für die 6502 und 6510 CPU 😉

                                      Also wenn ich es könnte und sicher wäre, dass ich nichts kaputt mache, würde ich das sehr gerne einen "Pull Request" machen. Ich bin davon aber noch Meilen entfernt 😞

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

                                        @ruhr70:

                                        @Bluefox:

                                        Und das alles nur dafür um kein Pull Request auf github zu machen. 😄

                                        Es ist sehr einfach die Info zugreifbar zu machen . Ich muss nur wissendass es nötig ist. 😄 `

                                        Na ja…

                                        2.500 Zeilen Code...

                                        Dann wüsste ich nicht, wie man das sauber in dem Adapter umsetzt.

                                        Und github/pull Request sind auch so Themen, mit denen ich sonst nichts zu tun habe.

                                        Programmierung kenne ich noch als Maschinencode und Assambler für die 6502 und 6510 CPU 😉

                                        Also wenn ich es könnte und sicher wäre, dass ich nichts kaputt mache, würde ich das sehr gerne einen "Pull Request" machen. Ich bin davon aber noch Meilen entfernt 😞 `
                                        Ich muss nur nicht vergessen. Dann baue ich das ein.

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

                                          @Bluefox:

                                          Ich muss nur nicht vergessen. Dann baue ich das ein. `

                                          Danke! 🙂

                                          Ich komme ganz gut damit zurecht, dass ich ein Script zweimal starten muss, damit es dann sauber läuft 🙂

                                          Ich erstell mir gerade ein Script-Template, welches ich dann hier für die Allgemeinheit reinstelle. Da wäre das halt unschön.

                                          Was kann ich tun, damit das nicht vergessen wird? Jira?

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

                                            @ruhr70:

                                            @Bluefox:

                                            Ich muss nur nicht vergessen. Dann baue ich das ein. `

                                            Danke! 🙂

                                            Ich komme ganz gut damit zurecht, dass ich ein Script zweimal starten muss, damit es dann sauber läuft 🙂

                                            Ich erstell mir gerade ein Script-Template, welches ich dann hier für die Allgemeinheit reinstelle. Da wäre das halt unschön.

                                            Was kann ich tun, damit das nicht vergessen wird? Jira? `
                                            Habe ich schon implementiert.

                                            Damit die Fehlermeldung nicht kommt muss man so eine Struktur machen.

                                            function ready () {
                                               // set start states
                                               setState('myState', 0);
                                               log('ready');
                                            }
                                            createState('state1',0);
                                            createState ('myState', ready);
                                            
                                            

                                            Weil createState asynchron ausgeführt wird und wir müssen warten, bis die Funktion fertig wird, bevor wir die mit setState ansprechen können.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            823
                                            Online

                                            31.9k
                                            Users

                                            80.2k
                                            Topics

                                            1.3m
                                            Posts

                                            4
                                            25
                                            3642
                                            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