Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst]Fehler in Skripten nach Javaskript Adapter Update auf 2.1.2

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst]Fehler in Skripten nach Javaskript Adapter Update auf 2.1.2

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

      Guten Morgen Pix,

      siehe http://forum.iobroker.net/viewtopic.php … 203#p26184

      Offiziell gibt es noch nichts, aber eine Lösung von paul53.

      Gruß

      Michael

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

        @pix:

        2016-05-24 02:08:29.778  - warn: javascript.0 Wrong type of javascript.0.Strom.Venta.Kosten.Jahr: string Please fix, while deprecated and will not work in next versions.
        

        Dabei sind die angesprochenen States gar nicht vom Typ string, sondern number! 😢 `
        Wie sieht dein Kode an dieser Stelle aus?

        Wenn typeof "string" sagt, dann ist es ein String 🙂

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

          Mit setState(id, val) werden String-Werte an Datenpunkte vom Typ 'number' (Zahl) übergeben. Das soll zukünftig vermieden werden.

          Wenn die Originale als String vorliegen, sollte

          Wert = parseFloat(Wert);
          // oder
          Wert = parseInt(Wert);
          

          darauf angewendet werden. Macht man das nicht, hat man ein Problem, wenn man mit den zurück gelesenen Werten rechnen will.

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

            Aus Deinem Verbrauchs-Skript:

                setState(instanz + pfad + geraet + '.Verbrauch.Tag',     (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3));           // Verbrauch an diesem Tag in kWh
            
            

            toFixed(3) erzeugt einen String !

            Mit createState wurde aber ein Datenpunkt mit type 'number' angelegt !

            Sollte also korrigiert werden:

            setState(instanz + pfad + geraet + '.Verbrauch.Tag', parseFloat((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3)));           // Verbrauch an diesem Tag in kWh
            
            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              Danke für die Erläuterungen…

              habe bei meinen Skripten nun auch einiges zu tun :shock: 😉

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

                Jetzt habe ich das verstanden. Das heißt im Klartext, dass man in Zukunft sehr genau evtl. Fehler abfangen muss. Gerade beim Parsen passiert da schnell ein Fehler. Ich habe es gerade mal geschafft 4 Skripte zu überarbeiten. 70! kommen noch. Da hab ih erstmal zu tun.

                Für einige Skripte, die hier veröffentlicht worden sind trifft das zu. Gerade habe ich am Skript für Spritpreise gearbeitet. Es folgen weitere.

                Gruß

                Pix

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

                  @paul53:

                  Aus Deinem Verbrauchs-Skript:

                      setState(instanz + pfad + geraet + '.Verbrauch.Tag',     (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3));           // Verbrauch an diesem Tag in kWh
                  
                  

                  toFixed(3) erzeugt einen String !

                  Mit createState wurde aber ein Datenpunkt mit type 'number' angelegt !

                  Sollte also korrigiert werden:

                  setState(instanz + pfad + geraet + '.Verbrauch.Tag', parseFloat((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3)));           // Verbrauch an diesem Tag in kWh
                  ```` `  
                  

                  Danke, das war aufschlussreich. Habs angepasst

                  ! ````
                  function berechneVerbrauchKosten(geraet, zaehler, preis) { // bei jedem eingehenden Wert pro Gerät
                  // Tag [Verbrauchskosten = (Zähler_ist - Zähler_Tagesbeginn) * Preis ] --- zaehler muss immer größer sein als Tages, Wochen, etc.-Wert
                  setState(instanz + pfad + geraet + '.Verbrauch.Tag', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val).toFixed(3) )); // Verbrauch an diesem Tag in kWh
                  setState(instanz + pfad + geraet + '.Kosten.Tag', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Tag').val) * preis).toFixed(3) )); // Kosten an diesem Tag in €
                  // Woche
                  setState(instanz + pfad + geraet + '.Verbrauch.Woche', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val).toFixed(3) ));
                  setState(instanz + pfad + geraet + '.Kosten.Woche', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Woche').val) * preis).toFixed(3) ));
                  // Monat
                  setState(instanz + pfad + geraet + '.Verbrauch.Monat', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val).toFixed(3) ));
                  setState(instanz + pfad + geraet + '.Kosten.Monat', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Monat').val) * preis).toFixed(3) ));
                  // Quartal
                  setState(instanz + pfad + geraet + '.Verbrauch.Quartal', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val).toFixed(3) ));
                  setState(instanz + pfad + geraet + '.Kosten.Quartal', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Quartal').val) * preis).toFixed(3) ));
                  // Jahr
                  setState(instanz + pfad + geraet + '.Verbrauch.Jahr', parseFloat( (zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val).toFixed(3) ));
                  setState(instanz + pfad + geraet + '.Kosten.Jahr', parseFloat( ((zaehler - getState(instanz + pfad + geraet + '.Zaehlerstand.Jahr').val) * preis).toFixed(3) ));
                  if (logging) log('Stromverbrauch und -kosten (' + geraet + ') aktualisiert', 'info');
                  }

                  Lasse das jetzt erstmal ein paar Tage laufen, bevor ich hier im Forum die neue Version poste.
                  
                  Gruß
                  
                  Pix
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @pix:

                    Das heißt im Klartext, dass man in Zukunft sehr genau evtl. Fehler abfangen muss. `
                    Wenn man sauber programmieren will, sollte man an den Datenpunkt-Typ denken.

                    Als quick and dirty Programmierer kann man auch Datenpunkte vom Typ 'mixed' mittels der Kurzform von createState(name, init) erzeugen, was ich allerdings nicht empfehle.

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

                      Ich habe schon immer versucht, in meinen Scripts die Parameter zu setzen.

                          createState(pfad + geraet + '.Zaehlerstand.Jahr',    0, {name: 'Zählerstand Jahresbeginn ('      + geraet + ')', type: 'number', unit:'kWh'});
                      
                      

                      Allerdings lasse ich read und write meistens weg (stehen immer auf true). Ebenso fehlt manchmal description.

                      Wenn jetzt also eine Zeichenkette in einen Number-Datenpunkt geschrieben werden soll, gibt es einen Fehler. Richtig? Gilt das auch für Adapter?

                      Gruß

                      Pix

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

                        @pix:

                        Wenn jetzt also eine Zeichenkette in einen Number-Datenpunkt geschrieben werden soll, gibt es einen Fehler. Richtig? `
                        Ja.
                        @pix:

                        Gilt das auch für Adapter? `
                        Bisher ist die Typprüfung nur im JS-Adapter implementiert.

                        Meiner Meinung nach sollte sie künftig für alle Adapter erfolgen. Ist aber vielleicht nicht die Meinung von Bluefox :?:

                        Oder schwierig zu realisieren ?

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        1.2k
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        4
                        11
                        2926
                        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