Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Berechnung Netzeinspeisung / if NL < 0 dann NE = PV – HV

    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

    Berechnung Netzeinspeisung / if NL < 0 dann NE = PV – HV

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

      Meinst du das:

      on({
          id: idNetzleistung,
          change: 'ne',
          valLt: 0
      }, function (data) {
          setState(idNetzeinspeisung, getState(idPVLeistung).val - getState(idHausverbrauch).val);
      });
      

      EDIT: wobei ich das so lösen würde, damit Netzeinspeisung auch 0 wird.

      var nNetzeinspeisung = 1;
      on({
          id: idNetzleistung,
          change: 'ne',
      }, function (data) {
      if (data.state.val < 0 ) {
          nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val;
          setState(idNetzeinspeisung, nNetzeinspeisung);
      else if( nNetzeinspeisung != 0) { 
          nNetzeinspeisung = 0;
          setState(idNetzeinspeisung, nNetzeinspeisung);
      });
      
      1 Reply Last reply Reply Quote 0
      • H
        highline last edited by highline

        Danke für deine Unterstützung, leider läuft das Script nicht, kannst du bitte nochmal prüfen:

        //Objekt erstellen
        
        createState('PV_Anlage.Netzeinspeisung',0, {
        
            name: 'PV-Anlage: Netzeinspeisung',
        
            desc: 'Netzeinspeisung = PV-Leistung – Hausverbrauch',
        
            read: true,
        
            write: true,
        
            type: 'number',
        
            unit: 'kWh'
        
        });
        
         
        
        var idPVLeistung = 'modbus.0.holdingRegisters.40068_PV_Leistung',
            idHausverbrauch = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung',
            idNetzleistung = 'modbus.0.holdingRegisters.40074_Netz_Leistung',
            idNetzeinspeisung = 'PV_Anlage.Netzeinspeisung';
              
             
             
        // Berechnung mit aktuellen Daten, wenn Netzleistung <0     
        
        var nNetzeinspeisung = 1;
        
        on({
        
        id: idNetzleistung,
        
        change: 'ne',
        
        }, function (data) {
        
        if (data.state.val < 0 ) {
        
        nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val;
        
        setState(idNetzeinspeisung, nNetzeinspeisung);
        
        // else if( nNetzeinspeisung != 0) { 
        
        // nNetzeinspeisung = 0;
        
        // setState(idNetzeinspeisung, nNetzeinspeisung);
        });
        

        Meldung ist: javascript.0 (6481) script.js.common.Netzeinspeisung compile failed: at script.js.common.Netzeinspeisung:51
        Zeile 46 - 50 habe ich auskommentiert, da ich dich Fragen wollte welche Auswirkungen das hat, bzw was da gemacht wird.
        Letzte Frage: Was wird in Zeile 30 gemacht?

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

          @highline sagte:

          compile failed

          Es fehlt die schließende geschweifte Klammer in Zeile 45 bzw. 46 für

          if (data.state.val < 0 ) {
          
          1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer last edited by ticaki

            @paul53 Danke, sind 2 schließende klammern

            var nNetzeinspeisung = 1;
            on({
                id: idNetzleistung,
                change: 'ne',
            }, function (data) {
              if (data.state.val < 0 ) {
                  nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val;
                  setState(idNetzeinspeisung, nNetzeinspeisung);
              } else if( nNetzeinspeisung != 0) { 
                nNetzeinspeisung = 0;
                setState(idNetzeinspeisung, nNetzeinspeisung);
              }
            });
            

            In 46-50 wird idNetzeinspeisung auf 0 gesetzt. In deinem vorigen Script war das nie 0.
            In 30 wird dafür gesorgt das beim ersten Durchlauf nach Scriptstart idNetzeinspeisung auf jeden Fall gesetzt wird. Und das die Kontrollvariable global ist und ihren Wert nicht verliert.

            1 Reply Last reply Reply Quote 0
            • H
              highline last edited by

              Das Script läuft nun. Vielen, vielen Dank an euch!!!
              Ich habe noch die Ladung des Speichers bei der Berechnung abgezogen, dann passt auch das Ergebnis.
              Frage: Warum muss ich die idNetzeinspeisung auf 0 setzen bzw. was passiert mit der Berechnung wenn ich das nicht mache?

              //Objekt erstellen
              
              createState('PV_Anlage.Netzeinspeisung',0, {
              
                  name: 'PV-Anlage: Netzeinspeisung',
              
                  desc: 'Netzeinspeisung = PV-Leistung – Hausverbrauch - Akku',
              
                  read: true,
              
                  write: true,
              
                  type: 'number',
              
                  unit: 'W'
              
              });
              
               
              var idPVLeistung = 'modbus.0.holdingRegisters.40068_PV_Leistung',
                  idHausverbrauch = 'modbus.0.holdingRegisters.40072_Hausverbrauch_Leistung',
                  idNetzleistung = 'modbus.0.holdingRegisters.40074_Netz_Leistung',
                  idAkku = 'modbus.0.holdingRegisters.40070_Batterie_Leistung',
                  idNetzeinspeisung = 'PV_Anlage.Netzeinspeisung';
                    
                    
              // Berechnung mit aktuellen Daten, wenn Netzleistung <0     
              
              var nNetzeinspeisung = 1;
              
              on({
              
              id: idNetzleistung,
              
              change: 'ne',
              
              }, function (data) {
              
              if (data.state.val < 0 ) {
              
              nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val - getState(idAkku).val;
              
              setState(idNetzeinspeisung, nNetzeinspeisung);
              }
              // else if( nNetzeinspeisung != 0) { 
              
              // nNetzeinspeisung = 0;
              
              // setState(idNetzeinspeisung, nNetzeinspeisung);
              });
              
              1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer last edited by ticaki

                Ohne dass wird dir immer eine Netzeinspeisung angezeigt, Weil der Wert nie auf null geht. Kann aber auch sein das ich was falsch verstanden habe.

                1 Reply Last reply Reply Quote 0
                • H
                  highline last edited by

                  ich beobachte mal das Verhalten, vielen Dank!

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @highline last edited by

                    @highline
                    In deinem ursprünglichen Script hast du 0 und positive Werte von idNetzleistung ausgeschlossen. Ich bin deshalb davon ausgegangen ,das es dort positive Werte oder 0 gibt. Um idNetzeinspeisung nicht in einem undefinierten Zustand zu haben, setzt meine Script den Wert in dem Fall auf 0 und ignoriert alle weiteren Werte größer gleich 0

                    H 1 Reply Last reply Reply Quote 0
                    • H
                      highline @ticaki last edited by highline

                      @ticaki
                      müsste es dann nicht statt: else if( nNetzeinspeisung != 0)
                      so heißen: else if( nNetzeinspeisung >= 0)

                      1 Reply Last reply Reply Quote 0
                      • T
                        ticaki Developer last edited by

                        Nope.

                        if (data.state.val < 0 ) {
                        

                        behandele übergebene Werte unterhalb von 0

                        nNetzeinspeisung = getState(idPVLeistung).val - getState(idHausverbrauch).val - getState(idAkku).val;
                        

                        Setzte die Variable mit dem berechneten Wert

                        } else if( nNetzeinspeisung != 0) {
                        

                        Bedingung 1. war unwahr und der zuletzt gesetzte Wert war nicht 0

                        nNetzeinspeisung = 0;
                        

                        setzte Variable auf 0

                        setState(idNetzeinspeisung, nNetzeinspeisung);
                        

                        setzte State auf Wert der Variable.

                        1 Reply Last reply Reply Quote 0
                        • H
                          highline last edited by

                          ok danke dir

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          479
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          3
                          12
                          573
                          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