Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Brauche Hilfe bei PV Laden Skript

    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

    Brauche Hilfe bei PV Laden Skript

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

      @paul53

      Darf ich dich nochmal belästigen? Du scheinst ein gutes Auge und natürlich auch das entsprechende Hintergrundwissen für Scripte allgemein zu haben. Bei mir ist das immer so mehr oder weniger try and error 😉 Könntest du nochmal einen Blick auf das "Konstrukt" werfen?

      Hier das Blockly als js Ansicht.

      Funktion soll wie folgt laufen:

      3 unterschiedliche Verbraucher verfügen über unterschiedliche Leistungsangaben und werden entsprechend des zur Verfügung stehendem PV Überschuss an bzw. aus geschaltet. Das ganze soll aber nur dann passieren, wenn der Speicher seinen Füllgrad erreicht hat und nicht unter ein bestimmtes Nivau gefallen ist.

      Dieses untere Speicher Nivau soll gleichzeitig als Wolkenpuffer fungieren.

      Kann das so funktionieren. Aktuell regnet es hier und ich kann nicht so wirklich gut live testen.

      var Speicher, Verbraucher_1, Verbraucher_2, Verbraucher_3, onDelay, onDelay, offDelay, offDelay;
      
      // Beschreibe diese Funktion …
      async function Verbraucher_1_F() {
        setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('e-Bike Ladestation ist ' + String(Verbraucher_1 == true ? 'AN' : 'AUS')), true);
        setState("sonoff.0.DEKO_3.POWER1"/*DEKO_3  POWER1*/, Verbraucher_1);
      }
      
      // Beschreibe diese Funktion …
      async function Verbraucher_2_F() {
        setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Raumentfeuchter ist ' + String(Verbraucher_2 == true ? 'AN' : 'AUS')), true);
        setState("sonoff.0.DEKO_4.POWER1"/*DEKO_4 POWER1*/, Verbraucher_2);
      }
      
      // Beschreibe diese Funktion …
      async function Verbraucher_3_F() {
        setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Freigabe Poolpumpe' + String(Verbraucher_3 == true ? 'EIN' : 'AUS')), true);
        setState("sonoff.0.DEKO_5.POWER1"/*DEKO_5  POWER1*/, Verbraucher_3);
      }
      
      // Beschreibe diese Funktion …
      async function PV_Ueberschuss() {
        setState("javascript.0.PV_Eigenverbrauch.PV_Ueberschuss_Freigabe "/*PV_Eigenverbrauch.PV_Ueberschuss_Freigabe */, ('PV Überschuss Freigabe ' + String(Speicher == true ? 'OK' : 'Gesperrt')), true);
      }
      
      
      Speicher = false;
      // Freigabe über Speicher SoC
      on({id: 'fronius.0.powerflow.inverter1.SOC', change: "any"}, async function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        if ((obj.state ? obj.state.val : "") >= 99.2) {
          (function () {if (offDelay) {clearTimeout(offDelay); offDelay = null;}})();
          if (!onDelay) {
            onDelay = setTimeout(async function () {
              Verbraucher_1 = true;
              Speicher = true;
            }, 180000);
          }
        }
        if ((obj.state ? obj.state.val : "") <= 97) {
          (function () {if (onDelay) {clearTimeout(onDelay); onDelay = null;}})();
          if (!offDelay) {
            offDelay = setTimeout(async function () {
              Speicher = false;
              Verbraucher_1 = false;
            }, 180000);
          }
        }
        await Verbraucher_1_F();
        await PV_Ueberschuss();
      });
      
      Verbraucher_1 = false;
      Verbraucher_2 = false;
      Verbraucher_3 = false;
      Verbraucher_1 = 300;
      Verbraucher_2 = 200;
      Verbraucher_3 = 100;
      // Verbraucher priorisiert nach Netzeiinspeisung starten
      on({id: 'discovergy.0.60868258.Power_Delivery', change: "ne"}, async function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        if (getState("discovergy.0.60868258.Power_Delivery").val >= 0) {
          if (Verbraucher_1 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 && Speicher == true) {
            Verbraucher_1 = true;
            await Verbraucher_1_F();
          }
          if (Verbraucher_1 == true && Verbraucher_2 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 && Speicher == true) {
            Verbraucher_2 = true;
            await Verbraucher_2_F();
          }
          if (Verbraucher_1 == true && Verbraucher_3 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 + Verbraucher_3 && Speicher == true) {
            Verbraucher_3 = true;
            await Verbraucher_3_F();
          }
        }
      });
      // Verbraucher priorisiert nach Netzeinspeisung stoppen
      on({id: 'discovergy.0.60868258.Power_Consumption', change: "ne"}, async function (obj) {
        var value = obj.state.val;
        var oldValue = obj.oldState.val;
        if (getState("discovergy.0.60868258.Power_Consumption").val > 0) {
          if (Verbraucher_1 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1) {
            Verbraucher_1 = false;
            await Verbraucher_1_F();
          } else if (Verbraucher_1 == true && Verbraucher_2 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2) {
            Verbraucher_2 = false;
            await Verbraucher_2_F();
          } else if (Verbraucher_1 == true && Verbraucher_2 == true && Verbraucher_3 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2 + Verbraucher_3) {
            Verbraucher_3 = false;
            await Verbraucher_3_F();
          }
        }
      });
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @JB_Sullivan last edited by

        @jb_sullivan sagte: Kann das so funktionieren.

        Als erstes fällt mir auf, dass onDelay und offDelay zweimal vorhanden sind (1. Zeile), was nicht funktioniert. Wähle bei "falls nicht onDelay"/"falls nicht offDelay" die jeweils andere Variable aus und überzeuge Dich in der Javascript-Ansicht davon, dass die Variablen nur noch einmal aufgeführt werden.

        Den Rest habe ich mir noch nicht angesehen.

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

          @paul53

          OK, da ich das ganze mit Timeout sowieso nie wirklich verstanden habe, habe ich das nun aus der Freigabe für den Speicher raus geworfen. Die beiden Werte <> sollten ja eigentlich bei der Trägheit des System ausreichend sein, damit es nicht prellt.

          Hier nochmal die korrigierte Version

          var Speicher, Verbraucher_1, Verbraucher_2, Verbraucher_3;
          
          // Beschreibe diese Funktion …
          async function Verbraucher_1_F() {
            setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('e-Bike Ladestation ist ' + String(Verbraucher_1 == true ? 'AN' : 'AUS')), true);
            setState("sonoff.0.DEKO_3.POWER1"/*DEKO_3  POWER1*/, Verbraucher_1);
          }
          
          // Beschreibe diese Funktion …
          async function Verbraucher_2_F() {
            setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Raumentfeuchter ist ' + String(Verbraucher_2 == true ? 'AN' : 'AUS')), true);
            setState("sonoff.0.DEKO_4.POWER1"/*DEKO_4 POWER1*/, Verbraucher_2);
          }
          
          // Beschreibe diese Funktion …
          async function Verbraucher_3_F() {
            setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Freigabe Poolpumpe' + String(Verbraucher_3 == true ? 'EIN' : 'AUS')), true);
            setState("sonoff.0.DEKO_5.POWER1"/*DEKO_5  POWER1*/, Verbraucher_3);
          }
          
          // Beschreibe diese Funktion …
          async function PV_Ueberschuss() {
            setState("javascript.0.PV_Eigenverbrauch.PV_Ueberschuss_Freigabe "/*PV_Eigenverbrauch.PV_Ueberschuss_Freigabe */, ('PV Überschuss Freigabe ' + String(Speicher == true ? 'OK' : 'Gesperrt')), true);
          }
          
          
          Speicher = false;
          // Freigabe über Speicher SoC
          on({id: 'fronius.0.powerflow.inverter1.SOC', change: "any"}, async function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            if ((obj.state ? obj.state.val : "") >= 99.2) {
              Speicher = true;
            }
            if ((obj.state ? obj.state.val : "") <= 97) {
              Speicher = false;
            }
            await PV_Ueberschuss();
          });
          
          Verbraucher_1 = false;
          Verbraucher_2 = false;
          Verbraucher_3 = false;
          Verbraucher_1 = 300;
          Verbraucher_2 = 200;
          Verbraucher_3 = 100;
          // Verbraucher priorisiert nach Netzeinspeisung starten
          on({id: 'discovergy.0.60868258.Power_Delivery', change: "ne"}, async function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            if (getState("discovergy.0.60868258.Power_Delivery").val >= 0) {
              if (Verbraucher_1 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 && Speicher == true) {
                Verbraucher_1 = true;
                await Verbraucher_1_F();
              }
              if (Verbraucher_1 == true && Verbraucher_2 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 && Speicher == true) {
                Verbraucher_2 = true;
                await Verbraucher_2_F();
              }
              if (Verbraucher_1 == true && Verbraucher_3 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 + Verbraucher_3 && Speicher == true) {
                Verbraucher_3 = true;
                await Verbraucher_3_F();
              }
            }
          });
          // Verbraucher priorisiert nach Netzeinspeisung stoppen
          on({id: 'discovergy.0.60868258.Power_Consumption', change: "ne"}, async function (obj) {
            var value = obj.state.val;
            var oldValue = obj.oldState.val;
            if (getState("discovergy.0.60868258.Power_Consumption").val > 0) {
              if (Verbraucher_1 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1) {
                Verbraucher_1 = false;
                await Verbraucher_1_F();
              } else if (Verbraucher_1 == true && Verbraucher_2 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2) {
                Verbraucher_2 = false;
                await Verbraucher_2_F();
              } else if (Verbraucher_1 == true && Verbraucher_2 == true && Verbraucher_3 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2 + Verbraucher_3) {
                Verbraucher_3 = false;
                await Verbraucher_3_F();
              }
            }
          });
          
          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @JB_Sullivan last edited by paul53

            @jb_sullivan
            Du verwendest die Variablen Verbraucher_1, Verbraucher_2, Verbraucher_3 mal als Boolean und mal als Zahl. Das kann nicht funktionieren.

            EDIT: Was für einen Wert enthält der Datenpunkt "Power_Delivery"?

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

              @paul53 einen positiven Zahlenwert (Einspeisung) genau wie Power_Consumption (Netzbezug)

              Das blöde ist, das der Wechselrichter immer versucht auf Einspeisung 0 zu regeln. Das ergiebt einen wilden Wechsel zwischen Bezug und Einspeisung, wenn nicht mit "tausenden" von Watt eingespeist wird. Das muss man irgendwie entprellen

              2b2664f8-5ad1-4bbc-bd9b-98c7441a417c-image.png

              123dd57b-af6f-497d-bf06-3af37232796b-image.png

              JB_Sullivan 1 Reply Last reply Reply Quote 0
              • JB_Sullivan
                JB_Sullivan @JB_Sullivan last edited by JB_Sullivan

                sieht das jetzt besser aus mit den Variablen bzgl. Unterscheidung Zahl / Boolean?

                a6131e51-52b3-45e9-9c93-175cbe06e22d-image.png

                paul53 2 Replies Last reply Reply Quote 0
                • paul53
                  paul53 @JB_Sullivan last edited by paul53

                  @jb_sullivan sagte: sieht das jetzt besser aus mit den Variablen bzgl. Unterscheidung Zahl / Boolean?

                  Nicht wirklich. Vorschlag:

                  Bild_2021-03-27_150359.png

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

                    @paul53

                    Sieht soweit ganz gut aus. Wann geschaltet wird, bestimmt im Moment im Grunde die Instanz von discovergy, da die Werte nur alle 180 Sekunden abgeholt werden.

                    D.h. wenn zu dem Zeitpunkt der Datenpunkt Aktualisierung der "falsche" Wert im DP drin steht, kommt es zu einer Verzögerung für die Zu- bzw. Abschaltung. Oder ist das über die Discovergy Adapter Einstellung vielleicht sogar besser um ein permanentes EIN/AUS schalten zu unterbinden?

                    768a61fb-25e5-41bc-a8e4-43df04a6c934-image.png

                    55a95baf-1662-4be1-9efa-cb2c01a09c78-image.png

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

                      @jb_sullivan
                      Beispiel Verbraucher schalten für verbraucher1:

                      Bild_2021-03-27_153448.png

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

                        @paul53

                        Das hatte ich ja schon so ähnlich

                        0e53ad1d-e313-47eb-ab19-5a53f232f7e1-image.png

                        Was bdeutet "ungleich" eigentlich?

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

                          @jb_sullivan sagte: Das hatte ich ja schon so ähnlich

                          Du rufts die Funktion aber nur zum Einschalten auf. So wird der Verbraucher nie wieder ausgeschaltet.

                          @jb_sullivan sagte in Brauche Hilfe bei PV Laden Skript:

                          Was bdeutet "ungleich" eigentlich?

                          Wenn der Sollzustand (Variable) und der Istzustand (Datenpunkt-Wert) unterschiedlich sind.

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

                            @paul53 "Wert von objekt ID" wäre in deinem Beispiel was (Power_Delivery oder Leistung_1)?

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

                              @jb_sullivan sagte: "Wert von objekt ID" wäre in deinem Beispiel was?

                              DEKO_3_POWER1

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

                                @paul53

                                😵 😵 Ähm - sicher? steuer wäre DEKO, aber Wert ist auch DEKO?

                                7dd9115a-9f5d-44ec-95ed-7f847a6b320f-image.png

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

                                  @jb_sullivan sagte: sicher? steuer wäre DEKO, aber Wert ist auch DEKO?

                                  Ja. Es soll ja nur gefunkt werden, wenn der Aktor nicht den Sollzustand hat (Störpegelverringerung).

                                  JB_Sullivan 1 Reply Last reply Reply Quote 1
                                  • JB_Sullivan
                                    JB_Sullivan @paul53 last edited by

                                    @paul53 Wir haben gerade einen coolen Sonnen/ Wolken Mix und ich habe den Aktualisierungsintervall vom Discovergy Adapter auf 30 Sekunden runter genommen und die Schaltschwellen entsprechend niedrig eingestellt.

                                    Ist ein lustiges geklackere der Sonoff Steckdosen - also mit anderen Worten. Scheint prächtig zu funktionieren 👍 👍 👍 Viele Dank für deine Unterstützung !!!

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

                                      @paul53
                                      Morgen. Ich hätte mal eine Frage zu meinem letzten Post wo du mir sehr geholfen hast. Habe gestern gemerkt das wenn der 1 timeout getriggert wird ist alles gut. Sobald der netz Bezug kommt, und die timeout 2 abläuft wechselt er den state ständig von wahr auf falsch. Das ganze macht er solange bis die Verzögerung abgelaufen ist. Wie könnte ich so etwas umgehen? Ich hoffe könnte es verständlich erkläre. Danke schonmal

                                      paul53 2 Replies Last reply Reply Quote 0
                                      • paul53
                                        paul53 @Malu last edited by

                                        @malu sagte: Sobald der netz Bezug kommt, und die timeout 2 abläuft wechselt er den state ständig von wahr auf falsch.

                                        Skript?

                                        1 Reply Last reply Reply Quote 0
                                        • M
                                          Malu last edited by

                                          @paul53 hallo. Das skribt hast du mir gezeigt. Sie ist vom 24.03.21. Ich kann es auch gerne noch mal einsenden

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

                                            @malu sagte: wechselt er den state ständig von wahr auf falsch. Das ganze macht er solange bis die Verzögerung abgelaufen ist.

                                            Das kann bei diesem Skript nicht passieren. Poste bitte den erzeugten Javascript-Code ohne die letzte Zeile in Code tags.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            759
                                            Online

                                            31.8k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            8
                                            75
                                            7521
                                            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