Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Objekt IDs in Skripten auf Konsistenz prüfen

    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

    Objekt IDs in Skripten auf Konsistenz prüfen

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

      Moin,

      ich habe es schon öfter gehabt, dass Skripte bei mir unbemerkt nicht mehr funktioniert haben, weil sich die IDs von Objekten geändert haben (bspw. weil ein Adapter seine Datenpunkte umbenannt hat, oder weil ich bei meinen eigenen Datenpunkten irgendwas umgebaut habe). Wahrscheinlich sollte man am Besten mit Aliasen arbeiten um das zu verhindern, aber das ist ein anderes Thema...

      Jetzt wäre es ja cool, wenn es einen Möglichkeit gäbe, sowas zu monitoren. Also eine Funktion, die bemerkt, wenn in einem Skirpt (oder Blockly) eine Objekt ID angesprochen wird, die es gar nicht (mehr) gibt.

      Gibt es soetwas schon, hat vielleicht irgendwer mal ein Skipt dafür gebaut...?

      Falls es das noch nicht gibt, wäre die Frage: Wie könnte ich am einfachsten auf den Code meiner Skripte zugreifen, um diesen dann zu parsen? Liegt der Skript-Code im Klartext auch in irgendwelchen Datenpunkten...?

      Viele Grüße
      Jan

      AlCalzone paul53 2 Replies Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators last edited by

        @centrofly sagte in Objekt IDs in Skripten auf Konsistenz prüfen:

        Gibt es soetwas schon,

        im Prinzip ja, aber ich habe es noch nicht selbst getestet.

        in einem solchen Fall kommt nämlich ein Fehler im log.
        mit dem Adapter log-parser müsste so etwas zu finden sein.

        1 Reply Last reply Reply Quote 0
        • AlCalzone
          AlCalzone Developer @centrofly last edited by

          @centrofly sagte in Objekt IDs in Skripten auf Konsistenz prüfen:

          Wie könnte ich am einfachsten auf den Code meiner Skripte zugreifen, um diesen dann zu parsen?

          Du könntest die Skripte mit der Adapter-Option auf Festplatte spiegeln und dann mit einem Texteditor bearbeiten.

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

            @centrofly sagte: Liegt der Skript-Code im Klartext auch in irgendwelchen Datenpunkten...?

            Nicht in Datenpunkten, sondern im Objekt "script.js.scriptname" unter common.source.

            C 1 Reply Last reply Reply Quote 0
            • C
              centrofly @paul53 last edited by

              @paul53 Ok super, lesen des source codes eines Skripts klappt schon mal so:

              var source = getObject('script.js.common.04_Monitor.myScript').common.source;
              log( source );
              

              Jetzt will ich ja über alle Skripte iterieren. Da stehe ich aber auf dem Schlauch. Ich dachte ich mache es mit einem Selektor, bspw. so:

              var selektor = $('script[id=script.js.common.*]');
              oder
              var selektor = $('state[id=script.js.common.*]');
              

              Aber das klappt irgendwie nicht. Hat jemand eine Idee wie ich alle Skripte zu fassen bekomme?

              Oder generell: Wie kann ich eigentlich alle Childs eines Channels selektieren...? Ich kenne nur den umgekehrten Weg, also den übergeordneten Knoten zu ermitteln (also mit split, slice etc.).

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

                @centrofly sagte: Aber das klappt irgendwie nicht.

                Der $Selector kann nur Datenpunkte.
                Jedes Skript hat auch einen Aktivierungs-Datenpunkt.

                const scriptsCommon = $('javascript.0.scriptEnabled.common.*');
                

                Damit lässt sich in einer Schleife "javascript.0.scriptEnabled" durch "script.js" ersetzen und so auf die Objekte zugreifen.

                EDIT:

                const scripts = $('javascript.0.scriptEnabled.*');
                
                scripts.each(function(id, i) {
                    id = id.replace('javascript.0.scriptEnabled', 'script.js');
                    if(existsObject(id) && getObject(id).type == 'script') {
                        // Auswertung von getObject(id).common.source
                    }
                });
                
                C 1 Reply Last reply Reply Quote 0
                • C
                  centrofly @paul53 last edited by centrofly

                  @paul53 Perfekt, das hat mir schon mal ordentlich weitergeholfen!

                  Folgendes gibt jetzt die Skripte mit den zugehörigen Objekt IDs aus (wenn diese im Code mit einem Hochkomma eingeschlossen sind):

                  const regex = new RegExp(`'[a-z]*\.0\.[a-zA-Z0-9.]*'`, `g`);
                  const scripts = $('javascript.0.scriptEnabled.*');
                   
                  scripts.each(function(id) 
                  {
                      id = id.replace('javascript.0.scriptEnabled', 'script.js');
                      
                      if(existsObject(id) && getObject(id).type == 'script') 
                      {
                          var source = getObject(id).common.source;
                          var matches = source.match(regex);
                  
                          if (matches != null)
                          {
                              matches.forEach(function (element)
                              {
                                  log(id + ' --> ' + element);
                  
                              });
                          }
                      }
                  });
                  

                  Gibt mir noch ein paar falsche Treffer, da muss sich noch ein wenig Feintuning betreiben, aber grob passt das so.

                  Vielen Dank für Eure Hilfe!
                  Jan

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  686
                  Online

                  31.8k
                  Users

                  80.0k
                  Topics

                  1.3m
                  Posts

                  4
                  7
                  223
                  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