Navigation

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

    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

    Adapterwerte und Script synchronisieren

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

      Ich will mich mal wieder einen Schritt weiter in JS einarbeiten.
      Vieles weiß ich schon, traue mich aber noch nicht so richtig, zumal Blockly (erst recht mit den zukünftigen neuen Bausteinen) eine fast vollwertige und einfachere Alternative ist.

      Mein jetziges Problem ist, dass ich zwei "geklaute" Skripte/Adapter miteinander kombinieren muss, was mir bisher nicht wirklich geggückt ist. Es ist zwar mit viel try and error immer besser geworden, daber nicht korrekt.

      Es geht um die Berechnung des effektiven Stromverbrauchs aus Daten vom Smartmeter-Adapters (Momentanwert Gesamtwirkleistung (Total) ist +/- je nach Leistung der Solaranlage) und dem Wert der AC-Leistung des Wechselrichters nach Auslesen desselben über ein Skript.

      Diese Werte kommen nicht synchron. Insbesondere bei stark wolkigem Wetter und schnell wechselndem Solarertrag ist eine Berechnung alle 10 Sekunden oft nicht korrekt, da die Werte so nicht synchronisiert sind.
      Solarwerte.png

      Ich denke, dass es funktionieren würde, wenn ich das Auslese skript nicht per schedule

      schedule("*/11 * 5-23 * * *", Piko);
      

      sondern irgendwo zu Beginn auf die Änderung des Wertes des smartmeteradapters synchronisieren würde.

      Wenn ich inzwischen richtig aufgepasst habe muss da irgendetwas mit

      ON...smartmeter.0.1-0:16_7_0_255.value.. not equal
      

      rein.

      Aber wo und wie genau?

      // Ausleseskript Wechselrichter Kostal Piko ab Firmware v05.31 (12.10.2015)
      
      //Variable
      
       //Leistungswerte
          ID_DCEingangGesamt = 33556736;         // in W
          ID_Ausgangsleistung = 67109120;        // in W
          ID_Eigenverbrauch = 83888128;          // in W
          //Status
          ID_Status = 16780032;                  // 0:Off
          //Statistik - Tag
          ID_Ertrag_d = 251658754;               // in Wh
          ID_Hausverbrauch_d = 251659010;        // in Wh
          ID_Eigenverbrauch_d = 251659266;       // in Wh
          ID_Eigenverbrauchsquote_d = 251659278; // in %
          ID_Autarkiegrad_d = 251659279;         // in %
          //Statistik - Gesamt
          ID_Ertrag_G = 251658753;               // in kWh
          ID_Hausverbrauch_G = 251659009;        // in kWh
          ID_Eigenverbrauch_G = 251659265;       // in kWh
          ID_Eigenverbrauchsquote_G = 251659280; // in %
          ID_Autarkiegrad_G = 251659281;         // in %
          ID_Betriebszeit = 251658496;           // in h
          //Momentanwerte - PV Genertor
          ID_DC1Spannung = 33555202;             // in V
          ID_DC1Strom = 33555201;                // in A
          ID_DC1Leistung = 33555203;             // in W
          ID_DC2Spannung = 33555458;             // in V
          ID_DC2Strom = 33555457;                // in A
          ID_DC2Leistung = 33555459;             // in W
          //Momentanwerte Haus
          ID_HausverbrauchSolar = 83886336;      // in W
          ID_HausverbrauchBatterie = 83886592;   // in W
          ID_HausverbrauchNetz = 83886848;       // in W
          ID_HausverbrauchPhase1 = 83887106;     // in W
          ID_HausverbrauchPhase2 = 83887362;     // in W
          ID_HausverbrauchPhase3 = 83887618;     // in W
          //Netz Netzparameter
          ID_NetzAusgangLeistung = 67109120;     // in W
          ID_NetzFrequenz = 67110400;            // in Hz
          ID_NetzCosPhi = 67110656;
          //Netz Phase 1
          ID_P1Spannung = 67109378;              // in V
          ID_P1Strom = 67109377;                 // in A
          ID_P1Leistung = 67109379;              // in W
          //Netz Phase 2
          ID_P2Spannung = 67109634;              // in V
          ID_P2Strom = 67109633;                 // in A
          ID_P2Leistung = 67109635;              // in W
          //Netz Phase 3
          ID_P3Spannung = 67109890;              // in V
          ID_P3Strom = 67109889;                 // in A
          ID_P3Leistung = 67109891;              // in W
      
      
       
      var IPAnlage = '192.168.138.103/api/dxs.json';   // IP der Photovoltaik-Anlage
      
      
      
      createState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_AC_aktuell', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_d',0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_G',0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Betriebszeit',0);
      createState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_DC_aktuell',0);
      createState('Messwerte.0.Solaranlage.Momentanwerte.Eigenverbrauch',0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_d');
      createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_G', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_d', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_G', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Tagesertrag', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Gesamtertrag', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_d', 0);
      createState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_G', 0);
      createState('Messwerte.0.Solaranlage.Momentanwerte.P1Spannung');
      createState('Messwerte.0.Solaranlage.Momentanwerte.P2Spannung');
      createState('Messwerte.0.Solaranlage.Momentanwerte.P1Strom');
      createState('Messwerte.0.Solaranlage.Momentanwerte.P2Strom');
      createState('Messwerte.0.Solaranlage.Momentanwerte.P1Leistung');
      createState('Messwerte.0.Solaranlage.Momentanwerte.P2Leistung');
      
      
      var logging = false;
      var request = require('request');
      
      function Piko() {
          if (logging) log("Piko 5.5 auslesen");
          request('http://' + IPAnlage + 
          '?dxsEntries=' + ID_DCEingangGesamt +
          '&dxsEntries=' + ID_Ausgangsleistung +
          '&dxsEntries=' + ID_Eigenverbrauch +
          '&dxsEntries=' + ID_Eigenverbrauch_d +
          '&dxsEntries=' + ID_Eigenverbrauch_G +
          '&dxsEntries=' + ID_Eigenverbrauchsquote_d +
          '&dxsEntries=' + ID_Eigenverbrauchsquote_G +
          '&dxsEntries=' + ID_Ertrag_d +
          '&dxsEntries=' + ID_Ertrag_G +
          '&dxsEntries=' + ID_Hausverbrauch_d +
          '&dxsEntries=' + ID_Hausverbrauch_G +
          '&dxsEntries=' + ID_Autarkiegrad_G +
          '&dxsEntries=' + ID_Autarkiegrad_d +
          '&dxsEntries=' + ID_Betriebszeit +
          '&dxsEntries=' + ID_P1Spannung +
          '&dxsEntries=' + ID_P2Spannung +
          '&dxsEntries=' + ID_P1Strom +
          '&dxsEntries=' + ID_P2Strom +
          '&dxsEntries=' + ID_P1Leistung +
          '&dxsEntries=' + ID_P2Leistung +
          '&dxsEntries=' + ID_Status +
          '&dxsEntries=' + ID_DC1Leistung +
          '&dxsEntries=' + ID_DC2Leistung,
          
          function (error, response, body) {
              if(!error && response.statusCode ==200) {
                  if(logging) log(body);
                  var result = JSON.parse(body).dxsEntries;
                  setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_DC_aktuell', result[0].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_AC_aktuell', result[1].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.Eigenverbrauch', result[2].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_d', result[3].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_G', result[4].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_d', result[5].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_G', result[6].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Tagesertrag', result[7].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Gesamtertrag', result[8].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_d', result[9].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_G', result[10].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_G', result[11].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_d', result[12].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Summenwerte.Betriebszeit', result[13].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.P1Spannung', result[14].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.P2Spannung', result[15].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.P1Strom', result[16].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.P2Strom', result[17].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.P1Leistung', result[18].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.P2Leistung', result[19].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.Status', result[20].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_String1', result[21].value || 0, true);
                  setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_String2', result[22].value || 0, true);
              } else {
                  log("Fehler: " + error + " bei Abfrage von: " + url, "warn");
              }
          });
      }
      
      
      schedule("*/11 * 5-23 * * *", Piko);
      

      Danke für jede Hilfe

      paul53 1 Reply Last reply Reply Quote 0
      • S
        stimezo Forum Testing last edited by

        Hallo Rainer,

        versuch es mal so:

        on({id: "smartmeter.0.1-0:16_7_0_255.value", change: "ne"}, function (obj) {
        
        // Ausleseskript Wechselrichter Kostal Piko ab Firmware v05.31 (12.10.2015)
        
        //Variable
        
         //Leistungswerte
            ID_DCEingangGesamt = 33556736;         // in W
            ID_Ausgangsleistung = 67109120;        // in W
            ID_Eigenverbrauch = 83888128;          // in W
            //Status
            ID_Status = 16780032;                  // 0:Off
            //Statistik - Tag
            ID_Ertrag_d = 251658754;               // in Wh
            ID_Hausverbrauch_d = 251659010;        // in Wh
            ID_Eigenverbrauch_d = 251659266;       // in Wh
            ID_Eigenverbrauchsquote_d = 251659278; // in %
            ID_Autarkiegrad_d = 251659279;         // in %
            //Statistik - Gesamt
            ID_Ertrag_G = 251658753;               // in kWh
            ID_Hausverbrauch_G = 251659009;        // in kWh
            ID_Eigenverbrauch_G = 251659265;       // in kWh
            ID_Eigenverbrauchsquote_G = 251659280; // in %
            ID_Autarkiegrad_G = 251659281;         // in %
            ID_Betriebszeit = 251658496;           // in h
            //Momentanwerte - PV Genertor
            ID_DC1Spannung = 33555202;             // in V
            ID_DC1Strom = 33555201;                // in A
            ID_DC1Leistung = 33555203;             // in W
            ID_DC2Spannung = 33555458;             // in V
            ID_DC2Strom = 33555457;                // in A
            ID_DC2Leistung = 33555459;             // in W
            //Momentanwerte Haus
            ID_HausverbrauchSolar = 83886336;      // in W
            ID_HausverbrauchBatterie = 83886592;   // in W
            ID_HausverbrauchNetz = 83886848;       // in W
            ID_HausverbrauchPhase1 = 83887106;     // in W
            ID_HausverbrauchPhase2 = 83887362;     // in W
            ID_HausverbrauchPhase3 = 83887618;     // in W
            //Netz Netzparameter
            ID_NetzAusgangLeistung = 67109120;     // in W
            ID_NetzFrequenz = 67110400;            // in Hz
            ID_NetzCosPhi = 67110656;
            //Netz Phase 1
            ID_P1Spannung = 67109378;              // in V
            ID_P1Strom = 67109377;                 // in A
            ID_P1Leistung = 67109379;              // in W
            //Netz Phase 2
            ID_P2Spannung = 67109634;              // in V
            ID_P2Strom = 67109633;                 // in A
            ID_P2Leistung = 67109635;              // in W
            //Netz Phase 3
            ID_P3Spannung = 67109890;              // in V
            ID_P3Strom = 67109889;                 // in A
            ID_P3Leistung = 67109891;              // in W
        
        
         
        var IPAnlage = '192.168.138.103/api/dxs.json';   // IP der Photovoltaik-Anlage
        
        
        
        createState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_AC_aktuell', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_d',0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_G',0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Betriebszeit',0);
        createState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_DC_aktuell',0);
        createState('Messwerte.0.Solaranlage.Momentanwerte.Eigenverbrauch',0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_d');
        createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_G', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_d', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_G', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Tagesertrag', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Gesamtertrag', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_d', 0);
        createState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_G', 0);
        createState('Messwerte.0.Solaranlage.Momentanwerte.P1Spannung');
        createState('Messwerte.0.Solaranlage.Momentanwerte.P2Spannung');
        createState('Messwerte.0.Solaranlage.Momentanwerte.P1Strom');
        createState('Messwerte.0.Solaranlage.Momentanwerte.P2Strom');
        createState('Messwerte.0.Solaranlage.Momentanwerte.P1Leistung');
        createState('Messwerte.0.Solaranlage.Momentanwerte.P2Leistung');
        
        
        var logging = false;
        var request = require('request');
        
        function Piko() {
            if (logging) log("Piko 5.5 auslesen");
            request('http://' + IPAnlage + 
            '?dxsEntries=' + ID_DCEingangGesamt +
            '&dxsEntries=' + ID_Ausgangsleistung +
            '&dxsEntries=' + ID_Eigenverbrauch +
            '&dxsEntries=' + ID_Eigenverbrauch_d +
            '&dxsEntries=' + ID_Eigenverbrauch_G +
            '&dxsEntries=' + ID_Eigenverbrauchsquote_d +
            '&dxsEntries=' + ID_Eigenverbrauchsquote_G +
            '&dxsEntries=' + ID_Ertrag_d +
            '&dxsEntries=' + ID_Ertrag_G +
            '&dxsEntries=' + ID_Hausverbrauch_d +
            '&dxsEntries=' + ID_Hausverbrauch_G +
            '&dxsEntries=' + ID_Autarkiegrad_G +
            '&dxsEntries=' + ID_Autarkiegrad_d +
            '&dxsEntries=' + ID_Betriebszeit +
            '&dxsEntries=' + ID_P1Spannung +
            '&dxsEntries=' + ID_P2Spannung +
            '&dxsEntries=' + ID_P1Strom +
            '&dxsEntries=' + ID_P2Strom +
            '&dxsEntries=' + ID_P1Leistung +
            '&dxsEntries=' + ID_P2Leistung +
            '&dxsEntries=' + ID_Status +
            '&dxsEntries=' + ID_DC1Leistung +
            '&dxsEntries=' + ID_DC2Leistung,
            
            function (error, response, body) {
                if(!error && response.statusCode ==200) {
                    if(logging) log(body);
                    var result = JSON.parse(body).dxsEntries;
                    setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_DC_aktuell', result[0].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_AC_aktuell', result[1].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.Eigenverbrauch', result[2].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_d', result[3].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauch_G', result[4].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_d', result[5].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Eigenverbrauchsquote_G', result[6].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Tagesertrag', result[7].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Gesamtertrag', result[8].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_d', result[9].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Hausverbrauch_G', result[10].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_G', result[11].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Autarkiegrad_d', result[12].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Summenwerte.Betriebszeit', result[13].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.P1Spannung', result[14].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.P2Spannung', result[15].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.P1Strom', result[16].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.P2Strom', result[17].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.P1Leistung', result[18].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.P2Leistung', result[19].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.Status', result[20].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_String1', result[21].value || 0, true);
                    setState('Messwerte.0.Solaranlage.Momentanwerte.Leistung_String2', result[22].value || 0, true);
                } else {
                    log("Fehler: " + error + " bei Abfrage von: " + url, "warn");
                }
            });
        }
        
        
        });
        

        Wenn der Wert von "smartmeter.0.1-0:16_7_0_255.value" sich ändert und ungleich dem vorherigen Wert ist, wird getriggert.

        Viele Grüße
        Christian

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

          @Homoran Anstelle des schedule() am Skriptende ein on() als Trigger auf den Smartmeter-Datenpunkt.

          on('smartmeter.0.1-0:16_7_0_255.value', Piko); // triggert bei Wertänderung
          

          Hoffentlich erfolgt die Wertänderung nicht zu schnell.

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

            Danke Paul!

            @paul53 sagte in Adapterwerte und Script synchronisieren:

            am Skriptende

            Das erschien mir auch am logischsten, aber ich dachte das muss immer (ziemlich weit) oben stehen.

            @paul53 sagte in Adapterwerte und Script synchronisieren:

            Hoffentlich erfolgt die Wertänderung nicht zu schnell.

            Im MOment alle 10 Sekunden - was wäre deiner Meinung denn ein "sicheres" Intervall?

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

              @Homoran sagte:

              ich dachte das muss immer (ziemlich weit) oben stehen.

              Nein, in der Regel weit unten, denn die Deklaration der im Trigger verwendeten Variablen und Funktionen sollte vorher erfolgen (damit der Parser/Compiler nicht mehrere Durchläufe benötigt).

              @Homoran sagte:

              alle 10 Sekunden

              Das sollte problemlos funktionieren, denn die Laufzeit der Funktion Piko() wird wohl erheblich geringer sein.

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

                @paul53
                Danke!
                Dann trau ich mich mal 😉

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

                Support us

                ioBroker
                Community Adapters
                Donate

                522
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                blockly javascript
                3
                6
                626
                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