Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Wie Werte in eine Blockly Funktion übergeben?

    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

    Wie Werte in eine Blockly Funktion übergeben?

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators last edited by Homoran

      Ich versuche mich gerade weiter in Javascript hereinzuknien (natürlich mithilfe von Blockly)

      Habe schon schmerzlich einen "Parser Block" so wie: [parse (TEXT) mit RegEx() an Pos()] vermisst, aber geht nicht gibt's nicht.

      Da es bei mir immer nach "geht nicht gibt's nicht" läuft habe ich hier ein ziemlich aufwändiges Konstrukt gebastelt:
      https://forum.iobroker.net/assets/uploads/files/1577838362266-sensemap-blockly.txt

      oder hier als js-Export:

      var URL2, Station, SensemapJson, result, JSON2, Anfang, Ende, Param1, Unit1, Sensor1, Wert1, Param2, Unit2, Sensor2, Wert2, Param3, Unit3, Sensor3, Wert3, Param4, Unit4, Sensor4, Wert4, Param5, Unit5, Sensor5, Wert5;
      
      
      URL2 = 'https://api.opensensemap.org/boxes/' + String(Station);
      schedule("*/10 * * * *", function () {
       try {
         require("request")(URL2, function (error, response, result) {
           SensemapJson = result;
         setState("0_userdata.0.Umwelt.Feinstaub_JSON"/*Feinstaub_JSON*/, SensemapJson, true);
         JSON2 = SensemapJson;
         Anfang = JSON2.indexOf('tle":"') + 1;
         JSON2 = JSON2.slice(((Anfang - 7) - 1), 100000);
         Anfang = JSON2.indexOf('tle":"') + 1;
         Ende = JSON2.indexOf('","uni') + 1;
         Param1 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('nit":"') + 1;
         Ende = JSON2.indexOf('","sen') + 1;
         Unit1 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('Type":"') + 1;
         Ende = JSON2.indexOf('","ico') + 1;
         Sensor1 = JSON2.slice(((Anfang + 7) - 1), Ende - 1);
         Anfang = JSON2.indexOf('lue":"') + 1;
         Ende = JSON2.indexOf('","cre') + 1;
         Wert1 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         JSON2 = JSON2.slice(((Ende + 30) - 1), 100000);
         Anfang = JSON2.indexOf('tle":"') + 1;
         Ende = JSON2.indexOf('","uni') + 1;
         Param2 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('nit":"') + 1;
         Ende = JSON2.indexOf('","sen') + 1;
         Unit2 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('Type":"') + 1;
         Ende = JSON2.indexOf('","ico') + 1;
         Sensor2 = JSON2.slice(((Anfang + 7) - 1), Ende - 1);
         Anfang = JSON2.indexOf('lue":"') + 1;
         Ende = JSON2.indexOf('","cre') + 1;
         Wert2 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         JSON2 = JSON2.slice(((Ende + 30) - 1), 100000);
         Anfang = JSON2.indexOf('tle":"') + 1;
         Ende = JSON2.indexOf('","uni') + 1;
         Param3 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('nit":"') + 1;
         Ende = JSON2.indexOf('","sen') + 1;
         Unit3 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('Type":"') + 1;
         Ende = JSON2.indexOf('","ico') + 1;
         Sensor3 = JSON2.slice(((Anfang + 7) - 1), Ende - 1);
         Anfang = JSON2.indexOf('lue":"') + 1;
         Ende = JSON2.indexOf('","cre') + 1;
         Wert3 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         JSON2 = JSON2.slice(((Ende + 33) - 1), 100000);
         Anfang = JSON2.indexOf('tle":"') + 1;
         Ende = JSON2.indexOf('","uni') + 1;
         Param4 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('nit":"') + 1;
         Ende = JSON2.indexOf('","sen') + 1;
         Unit4 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('Type":"') + 1;
         Ende = JSON2.indexOf('","ico') + 1;
         Sensor4 = JSON2.slice(((Anfang + 7) - 1), Ende - 1);
         Anfang = JSON2.indexOf('lue":"') + 1;
         Ende = JSON2.indexOf('","cre') + 1;
         Wert4 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         JSON2 = JSON2.slice(((Ende + 30) - 1), 100000);
         Anfang = JSON2.indexOf('tle":"') + 1;
         Ende = JSON2.indexOf('","uni') + 1;
         Param5 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('nit":"') + 1;
         Ende = JSON2.indexOf('","sen') + 1;
         Unit5 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         Anfang = JSON2.indexOf('Type":"') + 1;
         Ende = JSON2.indexOf('","ico') + 1;
         Sensor5 = JSON2.slice(((Anfang + 7) - 1), Ende - 1);
         Anfang = JSON2.indexOf('lue":"') + 1;
         Ende = JSON2.indexOf('","cre') + 1;
         Wert5 = JSON2.slice(((Anfang + 6) - 1), Ende - 1);
         console.log(Param1);
         console.log(Unit1);
         console.log(Sensor1);
         console.log(Wert1);
         console.log(Param2);
         console.log(Unit2);
         console.log(Sensor2);
         console.log(Wert2);
         console.log(Param3);
         console.log(Unit3);
         console.log(Sensor3);
         console.log(Wert3);
         console.log(Param4);
         console.log(Unit4);
         console.log(Sensor4);
         console.log(Wert4);
         console.log(Param5);
         console.log(Unit5);
         console.log(Sensor5);
         console.log(Wert5);
         }).on("error", function (e) {console.error(e);});
       } catch (e) { console.error(e); }
      });
      
      Station = '5dd2e6674ec04e001aa48f9e';
      

      Jetzt wollte ich das Ganze mittels (mir noch unbekannten) Funktionen und später mit Erstellen und befüllen der Datenpunkte vereinfachen.

      Aber bei den Funktionen bin ich anscheinend schon gescheitert
      Meine Idee war statt der vielen Variablen einfach nur einen Satz zu nehmen, den in einer Schleife zu befüllen und die Ergebnisse in einen Datenpunkt zu schreiben, der sich zum einen aus den Variablen zusammensettzt und zum anderen den Wert und die Einheit enthält.

      Dies bedingt aber, dass Teile des Scripts erst ablaufen müssen um Variablen zu befüllen, bevor ich diese in der Funktion benutzen kann.

      Geht so etwas überhaupt?
      Zumindest lässt sich der Block zur Erstellung der Funktion nicht in den Fluß einbinden.
      Klar - Funktionen und Variablen werden ja vorab deklariert.

      Funktionen_Sensemap.png

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

        @Homoran
        Die Funktion muss innerhalb der Callback-Funktion von request() aufgerufen werden, nachdem die auszuwertende Variable befüllt ist.

        Ein JSON wertet man nicht mittels String-Operationen aus, sondern wandelt es in ein Objekt und greift auf die Attribute des Objektes zu. Vorher sollte man sich die Struktur des Objektes in einem JSON-Viewer anschauen.

        Homoran 1 Reply Last reply Reply Quote 1
        • Homoran
          Homoran Global Moderator Administrators @paul53 last edited by Homoran

          @paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:

          Ein JSON wertet man nicht mittels String-Operationen aus

          War mir klar dass das als erstes kommt 😉
          Aber eins nach dem anderen - Rom ist auch nicht an einem Tag erbaut worden.

          Und bei anderen Rückgaben kommt vielleicht ein html oder plain text.

          @paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:

          Vorher sollte man sich die Struktur des Objektes in einem JSON-Viewer anschauen.

          Das habe ich gerade getan, als du den Link in einem anderen Thread gepostet hattest.
          Aber wirklich geholfen hatte mir das (noch) nichts.

          @paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:

          Die Funktion muss innerhalb der Callback-Funktion von request() aufgerufen werden, nachdem die auszuwertende Variable befüllt ist.

          klingt gut - und was heißt das?
          geht das mit Blockly?

          1 Reply Last reply Reply Quote 0
          • Homoran
            Homoran Global Moderator Administrators last edited by Homoran

            @paul53
            Hat länger gedauert vom Lesen bis zum Verstehen, was du da geschrieben hast

            DANKE mal wieder - läuft!
            Funktionen_Sensemap_ok.png

            Aber Verdauen muss ich das jetzt doch, warum es so funktioniert

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

              @Homoran
              Prinzip mit Wandlung nach Objekt:

              Blockly_temp.JPG
              Ist das Objekt ein Array von Sensoren ?

              Homoran 1 Reply Last reply Reply Quote 0
              • Homoran
                Homoran Global Moderator Administrators @paul53 last edited by Homoran

                @paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:

                Ist das Objekt ein Array von Sensoren ?

                Ja, das sehe ich mir gerne später an - versprochen!

                Momentan hänge ich noch am setState
                setstate_Sensor.png

                Kann man da variabel den Datenpunkt-Namen erzeugen?

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

                  @Homoran sagte:

                  Kann man da variabel den Datenpunkt-Namen erzeugen?

                  Leider nicht. Dazu brauchst Du eine Javascript-Funktion mit den Parametern id, unit:

                  createState(id, 0, {type:'number', unit:unit, read:true, write:false, role:'value'});
                  

                  Der Block "schreibe" kann eine zusammengesetzte ID verwenden.

                  Homoran 1 Reply Last reply Reply Quote 0
                  • Homoran
                    Homoran Global Moderator Administrators @paul53 last edited by

                    @paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:

                    Der Block "schreibe" kann eine zusammengesetzte ID verwenden.

                    Ich denke bei schreibe bekomme ich es hin, aber da meckert er, dass der Pfad nicht existiert

                    Ansonsten hat DSLRaser gerade in einem anderen Thread eine Funktion gezeigt, da muss es dann allerdings mit genuine js erstellt werden

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

                      @Homoran sagte:

                      ch denke bei schreibe bekomme ich es hin, aber da meckert er, dass der Pfad nicht existiert

                      Block "schreibe" setzt nur einen Wert in einen bereits existierenden Datenpunkt. Deshalb benötigst Du zum Erzeugen der DP die Javascript-Funktion.

                      Homoran 1 Reply Last reply Reply Quote 0
                      • Homoran
                        Homoran Global Moderator Administrators @paul53 last edited by

                        @paul53 sagte in Wie Werte in eine Blockly Funktion übergeben?:

                        @Homoran sagte:

                        ch denke bei schreibe bekomme ich es hin, aber da meckert er, dass der Pfad nicht existiert

                        Block "schreibe" setzt nur einen Wert in einen bereits existierenden Datenpunkt. Deshalb benötigst Du zum Erzeugen der DP die Javascript-Funktion.

                        Genau so hatte ich es mir gedacht.

                        Also folgendes Spiel:
                        setstate_Sensor_function.png

                        Eine Funktion createState(Pfad, 0, {type:'number', unit:Unit1, read:true, write:false, role:'value'}); in der Funktion, dann der Schreibe Block

                        Das klappt auch fast, nur die Bezeichnung rel. Luftfeuchte zerstört die Struktur wegen des Punkts.
                        Das muss ich noch irgendwie abfangen.

                        Dass Temperatur und Feuchte unter einem Sensor liegen ist gar nicht so schlimm.
                        Oder ich muss den Pfad umbauen.

                        mal sehen

                        Danke soweit

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        636
                        Online

                        31.9k
                        Users

                        80.3k
                        Topics

                        1.3m
                        Posts

                        blockly monitoring
                        2
                        10
                        1240
                        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