Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Photovoltaik Script

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Photovoltaik Script

    This topic has been deleted. Only users with topic management privileges can see it.
    • bahnuhr
      bahnuhr Forum Testing Most Active last edited by

      Hallo,

      also ich muss schon sagen. Das mit den Scripten gefällt mir immer mehr.

      Klappt schon ganz gut.

      Aus diesem Grund möchte ich mal etwas zurück geben.

      Im Homematic Forum gibt es ein Photovoltaik Script für Piko Wechselrichter.

      Dieses habe ich mal umgeschrieben auf iobroker.

      Für alle die es gebrauchen können.

      /* Photovoltaik: Piko 5.5 Anlage
      
      Diese Script stammt aus dem Homematic Forum. Von wem weiß ich nicht mehr.
      Lief bei mir als ccu.io.Script einwandfrei.
      
      Dieses Script habe ich nun auf iobroker umgeschrieben.
      
      @bahnuhr
      02.01.2017 Dieter Müller
      */
      
      //Variaben
      var idaktuell = 'javascript.0.Status.Photovoltaik.Leistung_aktuell';
      var idTag = 'javascript.0.Status.Photovoltaik.Tagesleistung';
      var idall = 'javascript.0.Status.Photovoltaik.Leistung_gesamt';
      var idP1 = 'javascript.0.Status.Photovoltaik.Leistung_Strang1';
      var idP2 = 'javascript.0.Status.Photovoltaik.Leistung_Strang2';
      
      var IPAnlage = '192.168.abc.de';   // IP der Photovoltaik-Anlage
      var PassAnlage = 'xxxxx';   // Password der Photovoltaik-Anlage
      
      var logging = true;
      
      // Ab hier nix mehr ändern
      createState(idaktuell, {
          type: 'mixed',
          name: 'Leistung aktuell',
      });
      createState(idTag, {
          type: 'mixed',
          name: 'Tagesleistung',
      });
      createState(idall, {
          type: 'mixed',
          name: 'Leistung gesamt',
      });
      createState(idP1, {
          type: 'mixed',
          name: 'Leistung Strang 1',
      });
      createState(idP2, {
          type: 'mixed',
          name: 'Leistung Strang 2',
      });
      
       function Piko() {
                  var cheerio = require('cheerio');
                  var request = require('request');
      
                  if (logging) log("Piko 5.5 auslesen");
                  request('http://SN-Login:' + PassAnlage +'@' + IPAnlage, function (error, response, body) {
                          $ = cheerio.load(body);
                          var d = $("td");
                          var pwr = d.eq(14).text().trim();
                          var day = d.eq(26).text().trim();
                          var all = d.eq(17).text().trim();
                          var v1 = d.eq(56).text().trim();
                          var i1 = d.eq(65).text().trim();
                          var p1 = v1 * i1;
                          var v2 = d.eq(82).text().trim();
                          var i2 = d.eq(91).text().trim();
                          var p2 = v2 * i2;
                          if (logging) log("Leistung aktuell= " + pwr);
                          if (logging) log("Tagesleistung= " + day);
                          if (logging) log("Leistung gesamt= " + all);
      					if (logging) log("Leistung Strang 1= " + p1);
      					if (logging) log("Leistung Strang 2= " + p2);
      
                          setState(idaktuell, pwr);
                          setState(idTag, day);
                          setState(idall, all);
                          setState(idP1, p1);
                          setState(idP2, p2);
                  });
          }
      
      schedule("3,7,12,17,22,27,32,37,42,47,52,57 * * * *", function () {
          log ("Auslöser: Schedule");
      	Piko();
      });
      
      

      mfg

      Dieter

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

        Sieht schon ganz passabel aus. Allrdings sollte man mit createState(id, {common}) nicht so nachlässig umgehen. Die Werte, die Du in die Datenpunkte schreibst, sind Zahlenwerte (common.type: "number") und haben eine Maßeinheit (common.unit: "kW"). Den DP-Typ "mixed" sollte man nicht explizit angeben , denn "mixed" ist default und erlaubt alle DP-Typen.

        1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active last edited by

          Hallo Paul,

          ich habe es mit number probiert.

          Dies erzeugt Fehlermeldung.

          Grund: Es scheint nicht die Sonne, und da wird xxx und nan reingeschrieben.

          Mit mixed klappt es.

          In homematic war dort vermerkt : VADPR (oder so ähnlich.)

          Fazit:

          Number klappt nicht -> erzeugt Fehlermeldung.

          Mixed klappt -> keine Fehlermeldung.

          Ob dies nun richtig ist, weiß ich nicht genau.

          Klappt aber.

          Schreib doch mal wie es richtig wäre.

          Ich lerne gerne dazu.

          mfg

          Dieter

          1 Reply Last reply Reply Quote 0
          • bahnuhr
            bahnuhr Forum Testing Most Active last edited by

            hab gerade nochmal nachgeschaut:

            Im ccu.io Script stand es so:

            setObject(firstId+2, {

            Name: "Gesamt Leistung",

            TypeName: "VARDP",

            _persistent: true

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

              Moin,

              @bahnuhr:

              Grund: Es scheint nicht die Sonne, und da wird xxx und nan reingeschrieben. `
              kannst Du das in Script nicht abfangen und stattdessen den Wert 0 zurückgeben lassen?

              Gruß,

              Eric

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

                @eric2905:

                kannst Du das in Script nicht abfangen und stattdessen den Wert 0 zurückgeben lassen? `
                So z.B.

                                    if(typeof pwr != 'number') pwr = 0;
                                    setState(idaktuell, pwr);
                
                
                1 Reply Last reply Reply Quote 0
                • F
                  Fitti last edited by

                  @paul53:

                  @eric2905:

                  kannst Du das in Script nicht abfangen und stattdessen den Wert 0 zurückgeben lassen? `
                  So z.B.

                                      if(typeof pwr != 'number') pwr = 0;
                                      setState(idaktuell, pwr);
                  
                  ```` `  
                  

                  Das kann ich nur empfehlen! Hatte es auch anders (also nicht abgefangen) und mir somit späteren Arger eingefangen, als ich mit den Werten rechnen, in Datenbank eintragen und grafisch anzeigen lassen wollte. Spätestens hier muss man dass dann abfangen.

                  Ansonsten staune ich schon wieder über paul53s Wissen:
                  @paul53:

                  Den DP-Typ "mixed" sollte man nicht explizit angeben , denn "mixed" ist default und erlaubt alle DP-Typen. `
                  Bedeutet dass, das ich hier dann unnötig Ressourcen verschwende - oder gehört es nicht zum guten (Programmier)Ton?

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

                    Ich werde beizeiten das Skript auch mal testen.

                    Bei mir läuft zur Zeit ein shell Skript auf dem raspi und schiebt die Daten in sysvar auf der CCU.

                    Bei meinem piko muss ich allerdings User und pwd eingeben. Ich habe das hier im Skript aber nicht gefunden oder übersehen.

                    Gruß

                    Rainer

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

                      @Fitti:

                      oder gehört es nicht zum guten (Programmier)Ton? `
                      Typ 'mixed' zu verwenden, wenn es sich um Zahlenwerte handelt, ist kein guter Programmierstil.

                      1 Reply Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active last edited by

                        @Homoran:

                        Bei meinem piko muss ich allerdings User und pwd eingeben. Ich habe das hier im Skript aber nicht gefunden oder übersehen. `

                        Hast du übersehen.

                        Hab ich oben unter Variablen definiert. Und wird dann im Script bearbeitet.

                        Mit freundlichen Grüßen

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

                          Aber doch nur pass, oder?

                          User sehe ich nicht.@bahnuhr:

                          var IPAnlage = '192.168.abc.de';   // IP der Photovoltaik-Anlage

                          var PassAnlage = 'xxxxx';   // Password der Photovoltaik-Anlage

                          var logging = true; `

                          @bahnuhr:

                          if (logging) log("Piko 5.5 auslesen");

                          request('http://SN-Login:' + PassAnlage +'@' + IPAnlage, function (error, response, body) { `

                          Gruß

                          Rainer

                          1 Reply Last reply Reply Quote 0
                          • bahnuhr
                            bahnuhr Forum Testing Most Active last edited by

                            Ich glaube User ist bei mir dieses

                            Sn-Login

                            Muss ich heute Abend mal nachschauen.

                            Mit freundlichen Grüßen

                            1 Reply Last reply Reply Quote 0
                            • bahnuhr
                              bahnuhr Forum Testing Most Active last edited by

                              @paul53

                              Habe als type nun number gesetzt (bei createState).

                              Bei den Variablen wurde teilweise string eingelesen. Diese musste ich wandeln mit parseFloat.

                              (hoffe das war richtig).

                              Danach habe ich die mit NaN auf 0 geetzt.

                              Läuft jetzt so.

                              Wenn dir noch etwas auffällt, dann Rückinfo an mich, Danke.

                              @homoran

                              Nutzername bei den Variablen ergänzt.

                              Achso, nun das Script:

                              ! ````
                              /* Photovoltaik: Piko 5.5 Anlage
                              ! Diese Script stammt aus dem Homematic Forum. Von wem weiß ich nicht mehr.
                              Lief bei mir als ccu.io.Script einwandfrei.
                              ! Dieses Script habe ich nun auf iobroker umgeschrieben.
                              ! @bahnuhr
                              02.01.2017 Dieter Müller
                              */
                              ! //Variaben
                              var idaktuell = 'javascript.0.Status.Photovoltaik.Leistung_aktuell';
                              var idTag = 'javascript.0.Status.Photovoltaik.Tagesleistung';
                              var idall = 'javascript.0.Status.Photovoltaik.Leistung_gesamt';
                              var idP1 = 'javascript.0.Status.Photovoltaik.Leistung_Strang1';
                              var idP2 = 'javascript.0.Status.Photovoltaik.Leistung_Strang2';
                              ! var NameAnlage = 'abcdefgh'; // Nutzername der Photovoltaik-Anlage
                              var PassAnlage = 'abcde'; // Password der Photovoltaik-Anlage
                              var IPAnlage = '192.168.xxx.xx'; // IP der Photovoltaik-Anlage
                              ! var logging = true;
                              ! // Ab hier nix mehr ändern
                              createState(idaktuell, {
                              type: 'number',
                              name: 'Leistung aktuell',
                              min: 0,
                              def: 0,
                              role: 'value'
                              });
                              createState(idTag, {
                              type: 'number',
                              name: 'Tagesleistung',
                              min: 0,
                              def: 0,
                              role: 'value'
                              });
                              createState(idall, {
                              type: 'number',
                              name: 'Leistung gesamt',
                              min: 0,
                              def: 0,
                              role: 'value'
                              });
                              createState(idP1, {
                              type: 'number',
                              name: 'Leistung Strang 1',
                              min: 0,
                              def: 0,
                              role: 'value'
                              });
                              createState(idP2, {
                              type: 'number',
                              name: 'Leistung Strang 2',
                              min: 0,
                              def: 0,
                              role: 'value'
                              });
                              ! function Piko() {
                              var cheerio = require('cheerio');
                              var request = require('request');
                              ! if (logging) log("Piko 5.5 auslesen");
                              request('http://' + NameAnlage + ':' + PassAnlage +'@' + IPAnlage, function (error, response, body) {
                              $ = cheerio.load(body);
                              var d = $("td");
                              var pwr = parseFloat(d.eq(14).text().trim());
                              var day = parseFloat(d.eq(26).text().trim());
                              var all = parseFloat(d.eq(17).text().trim());
                              var v1 = d.eq(56).text().trim();
                              var i1 = d.eq(65).text().trim();
                              var p1 = v1 * i1;
                              var v2 = d.eq(82).text().trim();
                              var i2 = d.eq(91).text().trim();
                              var p2 = v2 * i2;
                              if (isNaN(pwr)) pwr = 0;
                              if (isNaN(p1)) p1 = 0;
                              if (isNaN(p2)) p2 = 0;

                                              if (logging) log("Leistung aktuell= " + pwr);
                                              if (logging) log("Tagesleistung= " + day);
                                              if (logging) log("Leistung gesamt= " + all);
                              				if (logging) log("Leistung Strang 1= " + p1);
                              				if (logging) log("Leistung Strang 2= " + p2);
                              

                              ! setState(idaktuell, pwr);
                              setState(idTag, day);
                              setState(idall, all);
                              setState(idP1, p1);
                              setState(idP2, p2);
                              });
                              }
                              ! schedule("3,7,12,17,22,27,32,37,42,47,52,57 * * * *", function () {
                              log ("Auslöser: Schedule");
                              Piko();
                              });

                              
                              Viel Spass damit.
                              
                              mfg
                              
                              Dieter
                              1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 last edited by

                                @bahnuhr:

                                Bei den Variablen wurde teilweise string eingelesen. Diese musste ich wandeln mit parseFloat.

                                (hoffe das war richtig). `
                                Ja.
                                @bahnuhr:

                                Wenn dir noch etwas auffällt, dann Rückinfo an mich, `
                                Skripte künftig bitte innerhalb von Code-Tags posten.

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

                                  @paul53:

                                  Skripte künftig bitte innerhalb von Code-Tags posten. `
                                  Ich hab es gerade korrigiert

                                  Gruß

                                  Rainer

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    Strizz last edited by

                                    Hallo,

                                    ich besitze auch den Wechselrichter Piko 5.5 und würde das Script gerne mal testen. Leider hakt es da bei mir. Im Logfile bekomme ich folgende Fehlermeldung
                                    ` > 11:17:00.496 [error] javascript.0 script.js.common.Piko_auslesen: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/node_modules/cheerio' at Piko (script.js.common.Piko_auslesen:66:27), at Object. (script.js.common.Piko_auslesen:103:4), at Job.job (/opt/iobroker/node_modules/iobroker.javascript/javascript.js:1500:34), at Job.invoke (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/schedule.js:175:10), at null._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/schedule.js:479:11), at Timer.listOnTimeout (timers.js:92:15)

                                    11:17:00.496 [info] javascript.0 script.js.common.Piko_auslesen: Piko 5.5 auslesen `

                                    Soweit ich das verstehe, fehlt mir das Javascript-Module cheerio. Wie komme ich denn da dran? Fehlt mir nur ein Update?

                                    Ich habe nodejs version 4.4.5. Das ganze läuft auf eine Raspi 2.

                                    Wäre schön, wenn mir jemand auf die Sprünge helfen könnte.

                                    Gruß

                                    Strizz

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

                                      @Strizz:

                                      Soweit ich das verstehe, fehlt mir das Javascript-Module cheerio. Wie komme ich denn da dran? `
                                      üblicherweise in der Konfiguration des JS-Adapters eintragen - Adapter neu starten und gut ist.

                                      @Strizz:

                                      Fehlt mir nur ein Update? `
                                      kann ich nicht beurteilen, da ich es nicht weiß. Sollte das Paket schon irgendwo in einer veralteten Version drin sein, bringt natürlich der Eintrag in der Konfiguration nichts.

                                      Gruß

                                      Rainer

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        Strizz last edited by

                                        Hallo Rainer,

                                        Neustart hat nicht geholfen, Neuinstallation auch nicht. Kein Cheerio in dem besagten Verzeichnis.

                                        Noch eine Idee?

                                        Strizz

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

                                          @Strizz:

                                          Neustart hat nicht geholfen, Neuinstallation auch nicht. `
                                          Hast du denn cheerio:
                                          @Homoran:

                                          in der Konfiguration des JS-Adapters eintragen `

                                          Gruß

                                          Rainer

                                          1 Reply Last reply Reply Quote 0
                                          • S
                                            Strizz last edited by

                                            Hallo Rainer,

                                            wo steht denn so was? Aber genau das war es. Script läuft. Wenn jetzt nur noch die Sonne scheinen würde!

                                            Herzlichen Dank

                                            Ulrich

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            601
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            10
                                            41
                                            5196
                                            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