Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] - Learning JS - ein erster Versuch

    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] - Learning JS - ein erster Versuch

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

      @codierknecht sagte: Wie prüft man dann möglichst elegant?

      Ich würde es so machen:

        if(!isNaN(watts)) setState(dpPrefix + 'Watt', watts, true);
      // usw.
      
      Codierknecht 1 Reply Last reply Reply Quote 1
      • Codierknecht
        Codierknecht Developer Most Active @paul53 last edited by

        @paul53 sagte in Learning JS - ein erster Versuch:

        @codierknecht sagte: Wie prüft man dann möglichst elegant?

        Ich würde es so machen:

          if(!isNaN(watts)) setState(dpPrefix + 'Watt', watts, true);
        // usw.
        

        Ist oben eingebaut.
        Das Problem das ich da sehe: Wenn da mal "NaN" drinsteht, wird lediglich nix in den DP geschrieben.
        Eleganter wäre ja, wenn das iwie auch zu 'nem Fehler führen würde, der geloggt werden kann.
        Ich bau oben mal eine Variante dafür ein. Mal sehen, was ihr davon haltet.

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

          @codierknecht
          Übrigens: Bei den Werten, die im ursprünglichen Thema zu sehen sind, darf man nicht mit parseInt() wandeln, sondern mit parseFloat().
          Außerdem stehen die Werte laut Log immer hinter einem "):". Damit würde ich splitten.

          Codierknecht 2 Replies Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @paul53 last edited by

            @paul53 sagte in Learning JS - ein erster Versuch:

            @codierknecht
            Übrigens: Bei den Werten, die im ursprünglichen Thema zu sehen sind, darf man nicht mit parseInt() wandeln, sondern mit parseFloat().
            Außerdem stehen die Werte laut Log immer hinter einem "):". Damit würde ich splitten.

            Natürlich … werde ich oben ändern.

            @paul53 sagte in Learning JS - ein erster Versuch:

            @codierknecht
            Übrigens: Bei den Werten, die im ursprünglichen Thema zu sehen sind, darf man nicht mit parseInt() wandeln, sondern mit parseFloat().
            Außerdem stehen die Werte laut Log immer hinter einem "):". Damit würde ich splitten.

            Klingt auch etwas handlicher als mit Leerzeichen zu splitten.

            1 Reply Last reply Reply Quote 0
            • Codierknecht
              Codierknecht Developer Most Active @paul53 last edited by

              @paul53 sagte in Learning JS - ein erster Versuch:

              Außerdem stehen die Werte laut Log immer hinter einem "):". Damit würde ich splitten.

              Auch das habe ich oben geändert.
              Damit ist das mit den Array-Indizes 1,2 und 3 schon fast so einfach, dass man das enum auch wieder weglassen könnte.
              Ich lasse es aber wegen Wart- und Erweiterbarkeit mal drin.

              Codierknecht 1 Reply Last reply Reply Quote 0
              • Codierknecht
                Codierknecht Developer Most Active @Codierknecht last edited by

                @codierknecht
                Aktueller Stand für heute im Eingangspost.
                Das Konvertieren und Prüfen der Werte habe ich in eine eigene Funktion ausgelagert.

                Für heute lasse ich das erstmal so stehen. Morgen ist auch noch ein Tag.

                Letzte Erkenntnis für heute:
                Für mehr als 2-3 Zeilen JS lohnt sich auf jeden Fall die Installation von VSCode.

                Codierknecht 1 Reply Last reply Reply Quote 0
                • Codierknecht
                  Codierknecht Developer Most Active @Codierknecht last edited by

                  @codierknecht
                  Warum meckert VSCode hier?
                  f347a38c-68df-48d0-b36a-071ec9ef02b8-image.png

                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @Codierknecht last edited by OliverIO

                    @codierknecht
                    Es ist zwar ein separater Block aber evtl kollidiert diese error Deklaration mit der aus dem exec callback. Dort Ishtar man auch so ein kleines strichlein mit einem Hinweis.
                    Was passiert wenn du das error aus dem catch Block bspw nach err umbenennst?

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @OliverIO last edited by Codierknecht

                      @oliverio
                      Den Verdacht hatte ich auch schon - hilft nix 😞
                      Hab's dann wieder zu "error" zurück geändert, weil das so in fast allen Dokus verwendet wird.
                      Der Scope ist ja auch ein völlig anderer als das "error" in der Callback.
                      Es wird ja auch gemeckert, dass die gar nicht deklariert wäre. Dann müsste ich aber try-catch völlig falsch verstanden haben.

                      Die 3 Punkte im Callback meckern nur an, dass hier keine Typdeklaration vorhanden ist.
                      Da wir hier JS und kein TS haben, habe ich das mal geflissentlich ignoriert 😉

                      P.S.: Es meckert auch nur VSCode - im Editor im ioB sieht's OK aus

                      OliverIO Codierknecht 2 Replies Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @Codierknecht last edited by

                        @codierknecht

                        Evtl gilt hier dies
                        https://stackoverflow.com/questions/68240884/error-object-inside-catch-is-of-type-unknown

                        1 Reply Last reply Reply Quote 0
                        • Codierknecht
                          Codierknecht Developer Most Active @Codierknecht last edited by Codierknecht

                          Jetzt habe ich das zum Testen mal im ioB laufen lassen.
                          Dabei stolpere ich über das valueArray.length.
                          Wenn die Zeile drin ist, bringt mit das Log ein "undefined".
                          Kommentiere ich das aus, läuft das Script wie gewünscht und schreibt auch die erwartbaren Werte in die DP.

                          fbd78e70-4d7d-4a5c-be25-36c1a59fcfae-image.png

                          Interessant: Das Error-Handling funktioniert wie erwartet. Alles tacko

                          OliverIO 1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @Codierknecht last edited by

                            @codierknecht
                            kannst du bitte den source posten?

                            Codierknecht 1 Reply Last reply Reply Quote 0
                            • Codierknecht
                              Codierknecht Developer Most Active @OliverIO last edited by Codierknecht

                              @oliverio Voilá

                              const execPython = 'python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20';
                              const dpPrefix = '0_userdata.0.SunnyPortal.';
                              const arraySize = 6;
                              const position = {"watt": 1, "today": 2, "total": 3};
                              
                              createState(dpPrefix + 'Watt', 0, {name: 'Aktuelle Leistung', type: 'number', unit: 'W'});
                              createState(dpPrefix + 'Heute', 0, {name: 'Produziert heute', type: 'number', unit: 'kWh'});
                              createState(dpPrefix + 'Gesamt', 0, {name: 'Produziert gesamt', type: 'number', unit: 'kWh'});
                              
                              function parseValue(value) {
                                var result = parseFloat(value);
                                if (!isNaN(result)) {
                                  return result;
                                } else {
                                  throw 'Value <' + value + '> could not be converted';  
                                }
                              }
                              
                              function writeValues(watts, today, total) {
                                setState(dpPrefix + 'Watt', watts, true);
                                setState(dpPrefix + 'Heute', today, true);
                                setState(dpPrefix + 'Gesamt', total, true);
                              };
                              
                              function getData() {
                                try {
                              //    exec(execPython, function (error, result) {
                              //      if (!error) {
                              var result = 'X):100):150.55):200.88):Y):Z):blubb):blah';    
                                      log(result);
                                      var valueArray = result.split('):');
                                      if (valueArray.length != 6) throw "Result does not match expected length";
                                      writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
                              //      } else {
                              //        throw error;
                              //      }
                              //    });
                                } catch(err) {
                                  log('Error: ' + err.message);
                                }
                              }
                              
                              getData();
                              
                              //schedule('*/15 5-22 * * *', getData);
                              
                              

                              OliverIO 1 Reply Last reply Reply Quote 0
                              • OliverIO
                                OliverIO @Codierknecht last edited by OliverIO

                                @codierknecht sagte in Learning JS - ein erster Versuch:

                                Da du

                                throw "Result does not match expected length"
                                

                                machst wird an das catch auch nur der Text übergeben und nicht ein Error-Objekt.
                                Daher ist err.message undefined.
                                Korrekt wäre ein generisches Error-Objekt zu erzeugen

                                throw Error("Result does not match expected length")
                                

                                Dann klappt das auch mit dem Stacktrace bei der Fehlerausgabe, falls man den Fehler im catch den Fehler nach Prüfung dann doch rethrown möchte mit

                                throw error
                                
                                Codierknecht 1 Reply Last reply Reply Quote 1
                                • Codierknecht
                                  Codierknecht Developer Most Active @OliverIO last edited by

                                  @oliverio
                                  Danke - kaum macht man's richtig, klappt's auch.

                                  Hab's im Eingangspost nachgezogen.

                                  Codierknecht 1 Reply Last reply Reply Quote 0
                                  • Codierknecht
                                    Codierknecht Developer Most Active @Codierknecht last edited by

                                    @codierknecht
                                    Ich denke, mit dem aktuellen Ergebnis kann ich zufrieden sein.
                                    "Da wirst'e alt wie 'ne Kuh und lernst immer noch dazu".

                                    Und falls @jprisum-de hier mitliest:
                                    Natürlich ist das Script jetzt deutlich umfangreicher als das ursprüngliche.
                                    Hat aber einige entscheidende Vorteile:

                                    • Es ist vor allem lesbarer! Es ist damit intuitiv verständlich und leichter zu warten und zu erweitern.
                                    • Fehlerbehandlung: Mögliche Fehler werden abgefangen und mit
                                      einer aussagekräftige Meldung im Log protokolliert.

                                    Ich mach' dann hier mal zu ...

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

                                      @codierknecht sagte in [gelöst] - Learning JS - ein erster Versuch:

                                      Ich mach' dann hier mal zu ...

                                      kannst du nicht 😁

                                      Codierknecht 1 Reply Last reply Reply Quote 0
                                      • Codierknecht
                                        Codierknecht Developer Most Active @Homoran last edited by

                                        @homoran
                                        Achtung Goldwaagenalarm. Virtuell natürlich 😂

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

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        849
                                        Online

                                        31.8k
                                        Users

                                        80.0k
                                        Topics

                                        1.3m
                                        Posts

                                        5
                                        31
                                        970
                                        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