Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst] - Learning JS - ein erster Versuch

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

[gelöst] - Learning JS - ein erster Versuch

Scheduled Pinned Locked Moved JavaScript
31 Posts 5 Posters 1.5k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • CodierknechtC Offline
    CodierknechtC Offline
    Codierknecht
    Developer Most Active
    wrote on last edited by Codierknecht
    #1

    Basierend auf dem Thread script-funzt-nicht-mehr habe ich mich mal daran versucht, das umzubauen.
    Zu "verbessern" würde ich jetzt nicht sagen - ich will ja lediglich lernen.
    Also hier bitte keine fertigen Lösungen posten, sondern nur mitteilen, in welcher Zeile ein Fehler steckt oder wie man bestimmte Dinge besser löst.

    Gegegeben war folgendes Script:

    schedule('*/15 5-22 * * *', RunScript);
    
    function RunScript() {
      exec('python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20', function (error, result, stderr) {
      console.log(result, true);
      array = result.split(' ')
    
        console.warn(array[21] + array[22]);
        console.warn(array[36] + array[37]);
        console.warn(array[51] + array[52]);
        createState('SunnyPortal-Watt', array[21] + array[22], true;
        createState('SunnyPortal-Heute', array[36] + array[37], true;
        createState('SunnyPortal-Gesamt', array[51] + array[52], true;
    });
    }
    

    Im ersten Wurf habe ich daraus jetzt mal das hier produziert:
    (wird laufend korrigiert und ergänzt)

    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 Error('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) {
            console.log(result, true);
            var valueArray = result.split('):');
            if (valueArray.length != arraySize ) throw Error("Result does not match expected length");
            writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
          } else {
            throw error;
          }
        });
      } catch (error) {
        console.error(error);
      }
    }
    
    schedule('*/15 5-22 * * *', getData);
    
    • Sinnvoll eingerückt
    • Die Variable array umbenannt und deklariert
    • Stringliterale an den Anfang, damit man die an einer zentralen Stelle ggf. ändern kann
    • createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten
    • Lesen der Daten und Schreiben der DP in eigene Methoden ausgelagert

    Und jetzt kommt ihr:

    • Ist hier noch etwas grundlegend falsch? Wenn ja: Was und warum?
    • Was könnte man noch optimieren?

    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

    Proxmox 8.2.4 LXC|8 GB|Core i7-6700
    HmIP|ZigBee|Tasmota|Unifi + dies & das
    Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

    OliverIOO CodierknechtC paul53P 5 Replies Last reply
    1
    • CodierknechtC Codierknecht

      Basierend auf dem Thread script-funzt-nicht-mehr habe ich mich mal daran versucht, das umzubauen.
      Zu "verbessern" würde ich jetzt nicht sagen - ich will ja lediglich lernen.
      Also hier bitte keine fertigen Lösungen posten, sondern nur mitteilen, in welcher Zeile ein Fehler steckt oder wie man bestimmte Dinge besser löst.

      Gegegeben war folgendes Script:

      schedule('*/15 5-22 * * *', RunScript);
      
      function RunScript() {
        exec('python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20', function (error, result, stderr) {
        console.log(result, true);
        array = result.split(' ')
      
          console.warn(array[21] + array[22]);
          console.warn(array[36] + array[37]);
          console.warn(array[51] + array[52]);
          createState('SunnyPortal-Watt', array[21] + array[22], true;
          createState('SunnyPortal-Heute', array[36] + array[37], true;
          createState('SunnyPortal-Gesamt', array[51] + array[52], true;
      });
      }
      

      Im ersten Wurf habe ich daraus jetzt mal das hier produziert:
      (wird laufend korrigiert und ergänzt)

      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 Error('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) {
              console.log(result, true);
              var valueArray = result.split('):');
              if (valueArray.length != arraySize ) throw Error("Result does not match expected length");
              writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
            } else {
              throw error;
            }
          });
        } catch (error) {
          console.error(error);
        }
      }
      
      schedule('*/15 5-22 * * *', getData);
      
      • Sinnvoll eingerückt
      • Die Variable array umbenannt und deklariert
      • Stringliterale an den Anfang, damit man die an einer zentralen Stelle ggf. ändern kann
      • createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten
      • Lesen der Daten und Schreiben der DP in eigene Methoden ausgelagert

      Und jetzt kommt ihr:

      • Ist hier noch etwas grundlegend falsch? Wenn ja: Was und warum?
      • Was könnte man noch optimieren?
      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      wrote on last edited by
      #2

      @codierknecht
      um die blöden nicht lesbaren Indexnummern wegzubekommen könnte man den JS enum Ersatz nehmen

      const position = {
        "watt":    21,
        "today":   36,
        "total":   51
      };
      
      

      und dann so adressieren

      valueArray[position.watt]
      

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      CodierknechtC A 2 Replies Last reply
      1
      • CodierknechtC Codierknecht

        Basierend auf dem Thread script-funzt-nicht-mehr habe ich mich mal daran versucht, das umzubauen.
        Zu "verbessern" würde ich jetzt nicht sagen - ich will ja lediglich lernen.
        Also hier bitte keine fertigen Lösungen posten, sondern nur mitteilen, in welcher Zeile ein Fehler steckt oder wie man bestimmte Dinge besser löst.

        Gegegeben war folgendes Script:

        schedule('*/15 5-22 * * *', RunScript);
        
        function RunScript() {
          exec('python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20', function (error, result, stderr) {
          console.log(result, true);
          array = result.split(' ')
        
            console.warn(array[21] + array[22]);
            console.warn(array[36] + array[37]);
            console.warn(array[51] + array[52]);
            createState('SunnyPortal-Watt', array[21] + array[22], true;
            createState('SunnyPortal-Heute', array[36] + array[37], true;
            createState('SunnyPortal-Gesamt', array[51] + array[52], true;
        });
        }
        

        Im ersten Wurf habe ich daraus jetzt mal das hier produziert:
        (wird laufend korrigiert und ergänzt)

        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 Error('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) {
                console.log(result, true);
                var valueArray = result.split('):');
                if (valueArray.length != arraySize ) throw Error("Result does not match expected length");
                writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
              } else {
                throw error;
              }
            });
          } catch (error) {
            console.error(error);
          }
        }
        
        schedule('*/15 5-22 * * *', getData);
        
        • Sinnvoll eingerückt
        • Die Variable array umbenannt und deklariert
        • Stringliterale an den Anfang, damit man die an einer zentralen Stelle ggf. ändern kann
        • createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten
        • Lesen der Daten und Schreiben der DP in eigene Methoden ausgelagert

        Und jetzt kommt ihr:

        • Ist hier noch etwas grundlegend falsch? Wenn ja: Was und warum?
        • Was könnte man noch optimieren?
        CodierknechtC Offline
        CodierknechtC Offline
        Codierknecht
        Developer Most Active
        wrote on last edited by
        #3

        Meine erste Frage wäre:
        Die anonyme Methode beim exec wird mit 3 Parametern aufgerufen.
        Kann man den 3. Parameter stderr einfach weglassen?

        Zweite Frage (auch zum "exec"):
        Wie würde man hier grundsätzlich ein Error-Handling einbauen?

        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

        Proxmox 8.2.4 LXC|8 GB|Core i7-6700
        HmIP|ZigBee|Tasmota|Unifi + dies & das
        Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

        paul53P OliverIOO 2 Replies Last reply
        0
        • CodierknechtC Codierknecht

          Basierend auf dem Thread script-funzt-nicht-mehr habe ich mich mal daran versucht, das umzubauen.
          Zu "verbessern" würde ich jetzt nicht sagen - ich will ja lediglich lernen.
          Also hier bitte keine fertigen Lösungen posten, sondern nur mitteilen, in welcher Zeile ein Fehler steckt oder wie man bestimmte Dinge besser löst.

          Gegegeben war folgendes Script:

          schedule('*/15 5-22 * * *', RunScript);
          
          function RunScript() {
            exec('python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20', function (error, result, stderr) {
            console.log(result, true);
            array = result.split(' ')
          
              console.warn(array[21] + array[22]);
              console.warn(array[36] + array[37]);
              console.warn(array[51] + array[52]);
              createState('SunnyPortal-Watt', array[21] + array[22], true;
              createState('SunnyPortal-Heute', array[36] + array[37], true;
              createState('SunnyPortal-Gesamt', array[51] + array[52], true;
          });
          }
          

          Im ersten Wurf habe ich daraus jetzt mal das hier produziert:
          (wird laufend korrigiert und ergänzt)

          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 Error('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) {
                  console.log(result, true);
                  var valueArray = result.split('):');
                  if (valueArray.length != arraySize ) throw Error("Result does not match expected length");
                  writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
                } else {
                  throw error;
                }
              });
            } catch (error) {
              console.error(error);
            }
          }
          
          schedule('*/15 5-22 * * *', getData);
          
          • Sinnvoll eingerückt
          • Die Variable array umbenannt und deklariert
          • Stringliterale an den Anfang, damit man die an einer zentralen Stelle ggf. ändern kann
          • createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten
          • Lesen der Daten und Schreiben der DP in eigene Methoden ausgelagert

          Und jetzt kommt ihr:

          • Ist hier noch etwas grundlegend falsch? Wenn ja: Was und warum?
          • Was könnte man noch optimieren?
          paul53P Offline
          paul53P Offline
          paul53
          wrote on last edited by paul53
          #4

          @codierknecht sagte: createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten

          Sehr gut, aber es fehlt type: 'number'

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Reply Last reply
          1
          • CodierknechtC Codierknecht

            Basierend auf dem Thread script-funzt-nicht-mehr habe ich mich mal daran versucht, das umzubauen.
            Zu "verbessern" würde ich jetzt nicht sagen - ich will ja lediglich lernen.
            Also hier bitte keine fertigen Lösungen posten, sondern nur mitteilen, in welcher Zeile ein Fehler steckt oder wie man bestimmte Dinge besser löst.

            Gegegeben war folgendes Script:

            schedule('*/15 5-22 * * *', RunScript);
            
            function RunScript() {
              exec('python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20', function (error, result, stderr) {
              console.log(result, true);
              array = result.split(' ')
            
                console.warn(array[21] + array[22]);
                console.warn(array[36] + array[37]);
                console.warn(array[51] + array[52]);
                createState('SunnyPortal-Watt', array[21] + array[22], true;
                createState('SunnyPortal-Heute', array[36] + array[37], true;
                createState('SunnyPortal-Gesamt', array[51] + array[52], true;
            });
            }
            

            Im ersten Wurf habe ich daraus jetzt mal das hier produziert:
            (wird laufend korrigiert und ergänzt)

            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 Error('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) {
                    console.log(result, true);
                    var valueArray = result.split('):');
                    if (valueArray.length != arraySize ) throw Error("Result does not match expected length");
                    writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
                  } else {
                    throw error;
                  }
                });
              } catch (error) {
                console.error(error);
              }
            }
            
            schedule('*/15 5-22 * * *', getData);
            
            • Sinnvoll eingerückt
            • Die Variable array umbenannt und deklariert
            • Stringliterale an den Anfang, damit man die an einer zentralen Stelle ggf. ändern kann
            • createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten
            • Lesen der Daten und Schreiben der DP in eigene Methoden ausgelagert

            Und jetzt kommt ihr:

            • Ist hier noch etwas grundlegend falsch? Wenn ja: Was und warum?
            • Was könnte man noch optimieren?
            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            wrote on last edited by
            #5

            @codierknecht sagte in Learning JS - ein erster Versuch:

            execCall

            würde ich liebe execPython nennen

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Reply Last reply
            1
            • OliverIOO OliverIO

              @codierknecht
              um die blöden nicht lesbaren Indexnummern wegzubekommen könnte man den JS enum Ersatz nehmen

              const position = {
                "watt":    21,
                "today":   36,
                "total":   51
              };
              
              

              und dann so adressieren

              valueArray[position.watt]
              
              CodierknechtC Offline
              CodierknechtC Offline
              Codierknecht
              Developer Most Active
              wrote on last edited by Codierknecht
              #6

              Gute Idee, ich ziehe das im Eingangspost nach.

              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

              Proxmox 8.2.4 LXC|8 GB|Core i7-6700
              HmIP|ZigBee|Tasmota|Unifi + dies & das
              Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

              1 Reply Last reply
              0
              • OliverIOO OliverIO

                @codierknecht
                um die blöden nicht lesbaren Indexnummern wegzubekommen könnte man den JS enum Ersatz nehmen

                const position = {
                  "watt":    21,
                  "today":   36,
                  "total":   51
                };
                
                

                und dann so adressieren

                valueArray[position.watt]
                
                A Offline
                A Offline
                Ahnungsbefreit
                wrote on last edited by
                #7

                @oliverio @Codierknecht Gute Idee von @OliverIO aber ich würde auch erst einmal prüfen, wie groß das Array ist und ob an den Stellen auch wirklich eine Zahl steht. Sonst steigt das Script aus oder Du schreibst Müll in den Datenpunkt

                Wenn meine Antwort hilfreich war, dürft Ihr das gerne durch einen "Upvote" (der kleine "^" unten rechts) zum Ausdruck bringen.

                CodierknechtC 2 Replies Last reply
                1
                • CodierknechtC Codierknecht

                  Meine erste Frage wäre:
                  Die anonyme Methode beim exec wird mit 3 Parametern aufgerufen.
                  Kann man den 3. Parameter stderr einfach weglassen?

                  Zweite Frage (auch zum "exec"):
                  Wie würde man hier grundsätzlich ein Error-Handling einbauen?

                  paul53P Offline
                  paul53P Offline
                  paul53
                  wrote on last edited by paul53
                  #8

                  @codierknecht sagte: Kann man den 3. Parameter stderr einfach weglassen?

                  Ja.

                  @codierknecht sagte: Wie würde man hier grundsätzlich ein Error-Handling einbauen?

                  Einfachste Version:

                  if(!error) {
                      // Auswertung von stdout / result
                  }
                  

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  1 Reply Last reply
                  1
                  • CodierknechtC Codierknecht

                    Meine erste Frage wäre:
                    Die anonyme Methode beim exec wird mit 3 Parametern aufgerufen.
                    Kann man den 3. Parameter stderr einfach weglassen?

                    Zweite Frage (auch zum "exec"):
                    Wie würde man hier grundsätzlich ein Error-Handling einbauen?

                    OliverIOO Offline
                    OliverIOO Offline
                    OliverIO
                    wrote on last edited by OliverIO
                    #9

                    @codierknecht sagte in Learning JS - ein erster Versuch:

                    Die anonyme Methode beim exec wird mit 3 Parametern aufgerufen.
                    Kann man den 3. Parameter stderr einfach weglassen?

                    ja, kann man weglassen.
                    Notfalls kann man die möglichen Paramter auch diese auch über das Parameter-Array arguments entnehmen.
                    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments?retiredLocale=de

                    Kommt aber darauf an, wie die 'Fehlerbehandlung genau läuft.
                    Bin da jetzt kein Spezialist, da ich mit exec noch nicht so oft gearbeitet habe.

                    1. Fall 1: Programm gibt keinen Rückgabe Status, dann wurde es für node ohne Fehler ausgeführt. Wenn Programm den Fehler nur in stderr schreibt, dann muss da geparst werden
                    2. Fall 2: Programm gibt Rückgabe code für Fehler zurück, der müsste dann in error drin stehen. Die Fehlerbearbeitung müsste dann so aussehen
                    if (error) {
                    }
                    

                    Meine Adapter und Widgets
                    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                    Links im Profil

                    1 Reply Last reply
                    0
                    • A Ahnungsbefreit

                      @oliverio @Codierknecht Gute Idee von @OliverIO aber ich würde auch erst einmal prüfen, wie groß das Array ist und ob an den Stellen auch wirklich eine Zahl steht. Sonst steigt das Script aus oder Du schreibst Müll in den Datenpunkt

                      CodierknechtC Offline
                      CodierknechtC Offline
                      Codierknecht
                      Developer Most Active
                      wrote on last edited by
                      #10

                      @ahnungsbefreit
                      Das Array sollte dabei ja fix sein. Ein

                      if (array.length != 99) throw "Result does not match expected length";
                      

                      sollte funktionieren, oder?

                      OK, die tatsächliche Größe des Array kenne ich aktuell nicht, da ich das Result aus dem Original-Post nie gesehen habe (oder zu faul bin das abzutippen).

                      Ich werde die Ergänzungen im im Eingangspost nachziehen, damit das hier nicht zu unübersichtlich wird.

                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                      Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                      HmIP|ZigBee|Tasmota|Unifi + dies & das
                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                      1 Reply Last reply
                      0
                      • A Ahnungsbefreit

                        @oliverio @Codierknecht Gute Idee von @OliverIO aber ich würde auch erst einmal prüfen, wie groß das Array ist und ob an den Stellen auch wirklich eine Zahl steht. Sonst steigt das Script aus oder Du schreibst Müll in den Datenpunkt

                        CodierknechtC Offline
                        CodierknechtC Offline
                        Codierknecht
                        Developer Most Active
                        wrote on last edited by
                        #11

                        @ahnungsbefreit sagte in Learning JS - ein erster Versuch:

                        ob an den Stellen auch wirklich eine Zahl

                        Wirft parseInt() einen Fehler, wenn keine Zahl drin steht?

                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                        Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                        HmIP|ZigBee|Tasmota|Unifi + dies & das
                        Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                        paul53P 1 Reply Last reply
                        0
                        • CodierknechtC Codierknecht

                          @ahnungsbefreit sagte in Learning JS - ein erster Versuch:

                          ob an den Stellen auch wirklich eine Zahl

                          Wirft parseInt() einen Fehler, wenn keine Zahl drin steht?

                          paul53P Offline
                          paul53P Offline
                          paul53
                          wrote on last edited by
                          #12

                          @codierknecht sagte: Wirft parseInt() einen Fehler, wenn keine Zahl drin steht?

                          Nein, es liefert NaN (Not a Number).

                          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                          CodierknechtC 1 Reply Last reply
                          0
                          • paul53P paul53

                            @codierknecht sagte: Wirft parseInt() einen Fehler, wenn keine Zahl drin steht?

                            Nein, es liefert NaN (Not a Number).

                            CodierknechtC Offline
                            CodierknechtC Offline
                            Codierknecht
                            Developer Most Active
                            wrote on last edited by
                            #13

                            @paul53 sagte in Learning JS - ein erster Versuch:

                            Nein, es liefert NaN (Not a Number).

                            Wie prüft man dann möglichst elegant?

                            if (isNaN(parseInt(valueArray[position.watt]) || isNaN(parseInt(valueArray[position.today]) ... 
                            

                            sieht irgendwie reichlich sperrig aus.
                            OK, man könnte das auch noch in eine Prüfmethode auslagern.

                            Ihr seit mir schon fast zu schnell. Ich komme ja kaum noch nach 😉

                            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                            Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                            HmIP|ZigBee|Tasmota|Unifi + dies & das
                            Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                            paul53P 1 Reply Last reply
                            0
                            • CodierknechtC Codierknecht

                              @paul53 sagte in Learning JS - ein erster Versuch:

                              Nein, es liefert NaN (Not a Number).

                              Wie prüft man dann möglichst elegant?

                              if (isNaN(parseInt(valueArray[position.watt]) || isNaN(parseInt(valueArray[position.today]) ... 
                              

                              sieht irgendwie reichlich sperrig aus.
                              OK, man könnte das auch noch in eine Prüfmethode auslagern.

                              Ihr seit mir schon fast zu schnell. Ich komme ja kaum noch nach 😉

                              paul53P Offline
                              paul53P Offline
                              paul53
                              wrote on last edited by paul53
                              #14

                              @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.
                              

                              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                              CodierknechtC 1 Reply Last reply
                              1
                              • paul53P 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.
                                
                                CodierknechtC Offline
                                CodierknechtC Offline
                                Codierknecht
                                Developer Most Active
                                wrote on last edited by
                                #15

                                @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.

                                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                                HmIP|ZigBee|Tasmota|Unifi + dies & das
                                Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                1 Reply Last reply
                                0
                                • CodierknechtC Codierknecht

                                  Basierend auf dem Thread script-funzt-nicht-mehr habe ich mich mal daran versucht, das umzubauen.
                                  Zu "verbessern" würde ich jetzt nicht sagen - ich will ja lediglich lernen.
                                  Also hier bitte keine fertigen Lösungen posten, sondern nur mitteilen, in welcher Zeile ein Fehler steckt oder wie man bestimmte Dinge besser löst.

                                  Gegegeben war folgendes Script:

                                  schedule('*/15 5-22 * * *', RunScript);
                                  
                                  function RunScript() {
                                    exec('python /opt/SunnyPortal/SunnyPortal.py 192.168.178.20', function (error, result, stderr) {
                                    console.log(result, true);
                                    array = result.split(' ')
                                  
                                      console.warn(array[21] + array[22]);
                                      console.warn(array[36] + array[37]);
                                      console.warn(array[51] + array[52]);
                                      createState('SunnyPortal-Watt', array[21] + array[22], true;
                                      createState('SunnyPortal-Heute', array[36] + array[37], true;
                                      createState('SunnyPortal-Gesamt', array[51] + array[52], true;
                                  });
                                  }
                                  

                                  Im ersten Wurf habe ich daraus jetzt mal das hier produziert:
                                  (wird laufend korrigiert und ergänzt)

                                  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 Error('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) {
                                          console.log(result, true);
                                          var valueArray = result.split('):');
                                          if (valueArray.length != arraySize ) throw Error("Result does not match expected length");
                                          writeValues(parseValue(valueArray[position.watt]), parseValue(valueArray[position.today]), parseValue(valueArray[position.total]));
                                        } else {
                                          throw error;
                                        }
                                      });
                                    } catch (error) {
                                      console.error(error);
                                    }
                                  }
                                  
                                  schedule('*/15 5-22 * * *', getData);
                                  
                                  • Sinnvoll eingerückt
                                  • Die Variable array umbenannt und deklariert
                                  • Stringliterale an den Anfang, damit man die an einer zentralen Stelle ggf. ändern kann
                                  • createState nur 1x beim Start des Script, dann aber unterhalb von 0_userdata und mit Namen und Einheiten
                                  • Lesen der Daten und Schreiben der DP in eigene Methoden ausgelagert

                                  Und jetzt kommt ihr:

                                  • Ist hier noch etwas grundlegend falsch? Wenn ja: Was und warum?
                                  • Was könnte man noch optimieren?
                                  paul53P Offline
                                  paul53P Offline
                                  paul53
                                  wrote on last edited by paul53
                                  #16

                                  @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.

                                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                  CodierknechtC 2 Replies Last reply
                                  0
                                  • paul53P 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.

                                    CodierknechtC Offline
                                    CodierknechtC Offline
                                    Codierknecht
                                    Developer Most Active
                                    wrote on last edited by
                                    #17

                                    @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.

                                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                    Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                                    HmIP|ZigBee|Tasmota|Unifi + dies & das
                                    Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                    1 Reply Last reply
                                    0
                                    • paul53P 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.

                                      CodierknechtC Offline
                                      CodierknechtC Offline
                                      Codierknecht
                                      Developer Most Active
                                      wrote on last edited by
                                      #18

                                      @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.

                                      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                      Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                                      HmIP|ZigBee|Tasmota|Unifi + dies & das
                                      Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                      CodierknechtC 1 Reply Last reply
                                      0
                                      • CodierknechtC Codierknecht

                                        @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.

                                        CodierknechtC Offline
                                        CodierknechtC Offline
                                        Codierknecht
                                        Developer Most Active
                                        wrote on last edited by
                                        #19

                                        @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.

                                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                        Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                                        HmIP|ZigBee|Tasmota|Unifi + dies & das
                                        Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                        CodierknechtC 1 Reply Last reply
                                        0
                                        • CodierknechtC Codierknecht

                                          @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.

                                          CodierknechtC Offline
                                          CodierknechtC Offline
                                          Codierknecht
                                          Developer Most Active
                                          wrote on last edited by
                                          #20

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

                                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Martin Fowler, "Refactoring")

                                          Proxmox 8.2.4 LXC|8 GB|Core i7-6700
                                          HmIP|ZigBee|Tasmota|Unifi + dies & das
                                          Konnte ich Dir helfen? Dann benutze bitte das Voting unten rechts im Beitrag

                                          OliverIOO 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          571

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe