Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. [gelöst] per falls deaktivierte Aktionen werden ausgeführt

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] per falls deaktivierte Aktionen werden ausgeführt

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

      Hallo zusammen.
      ich habe ein Blockly mit dem ich den Ladestrom für mein e-Auto Abhängig vom Überschuss steuere.
      Das klappt soweit auch ganz gut.

      car_override.png
      (weil abgeschnitten: getriggert wird auf die Einspeisung alle 6 Sekunden, und auf die Aktivierung des Laders)

      Zusätzlich habe ich für den "Schlechtwetter-Notfall" einen Knopf zum deaktivieren dieser überschussabhängigen Steuerung eingebaut und im Skript abgefragt.

      Eigentlich dürfte nach meinem Verständnis bei aktivem Knopf, keine Anpassung des Ladestroms stattfinden.
      passiert aber:

      ladestrom_override01.png

      um 10:36 wurde der state "manual_override" auf true gesetzt, trotzdem wird um 11:01 geregelt.


      var Neustart, Ladestrom_min, Ladestrom_geplant, Ladung, Messdauer, Ueberschussliste, Mindesteinspeisung, Ueberschuss, Ueberschusssumme, Ueberschuss_avg, Intervall;

      Neustart = false;
      Ladestrom_min = 6;
      Ladestrom_geplant = 6;
      Ladung = false;
      Messdauer = 60;
      Ueberschussliste = [];
      Mindesteinspeisung = 1050;
      Ueberschuss = 0;
      // Überwachung der Einspeisung
      on({id: new RegExp('smartmeter\.0\.1-0:16_7_0__255\.value' + "$|" + 'go-e\.0\.allow_charging' + "$"), change: "ne"}, async function (obj) {
      if (getState('go-e.0.allow_charging').val == true) {
      // Überschussberechnung
      Ueberschuss = getState('smartmeter.0.1-0:16_7_0__255.value').val * -1 + getState('hm-rpc.0.REQ0777349.2.POWER').val;
      // Mittelwertberechnung
      Ueberschussliste.push(Ueberschuss);
      if (Ueberschussliste.length > Messdauer) {
      Ueberschussliste.splice(0, 1);
      }
      // Überschuss prüfen
      }
      if (getState('Systemvariablen.0.Autoladen.manual_override').val == false) {
      Ueberschusssumme = Ueberschussliste.reduce(function(x, y) {return x + y;});
      Ueberschuss_avg = Ueberschusssumme / Ueberschussliste.length;
      if (Ueberschuss_avg > Mindesteinspeisung && (Ladung == false || Neustart == true)) {
      // ausreichend Überschuss
      Ladung = true;
      Neustart = false;
      // Laden starten
      Intervall = setInterval(async function () {
      // Ladestrom berechnen (bei 1-phasig)
      if (getState('zoe2.0.xxx.charge_level').val >= 98) {
      Ladestrom_min = 8;
      } else {
      Ladestrom_min = 6;
      }
      Ladestrom_geplant = getState("Messwerte.0.Wetterdaten.Sonnenaenderungen2").val < 4 ? Math.min(Math.max(Math.round(Ueberschuss_avg / 215), 0), 16) : Math.min(Math.max((-0.044 * getState("Messwerte.0.Wetterdaten.Sonnenaenderungen2").val + 1.175) * Math.round(Ueberschuss_avg / 215), 0), 16);
      if (Ladestrom_geplant < Ladestrom_min) {
      Ladestrom_geplant = Ladestrom_min;
      } else if (Ladestrom_geplant >= Ladestrom_min) {
      Ladestrom_geplant = Ladestrom_geplant;
      }
      // Überschussmenge laden
      if (Ladestrom_geplant != getState('go-e.0.amperePV').val && getState('go-e.0.allow_charging').val == true) {
      setStateDelayed('go-e.0.amperePV', Ladestrom_geplant, false, parseInt(((0) || "").toString(), 10), false);
      }
      }, 180000);
      // nicht mehr ausreichend Überschuss
      } else if (Ueberschuss_avg < Mindesteinspeisung * 0.8 && Ladung == true) {
      // Laden beenden
      Ladung = false;
      Ladestrom_geplant = 8;
      setStateDelayed('go-e.0.amperePV', Ladestrom_geplant, false, parseInt(((0) || "").toString(), 10), false);
      if (getState('go-e.0.allow_charging').val != 0) {
      setStateDelayed('go-e.0.allow_charging', 0, false, parseInt(((0) || "").toString(), 10), false);
      }
      (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
      }
      }
      // Not-Aus - Laden beenden
      if (getState('smartmeter.0.1-0:16_7_0__255.value').val > 10000) {
      console.log('Not-Aus');
      Ladung = false;
      setStateDelayed('go-e.0.amperePV', 8, false, parseInt(((0) || "").toString(), 10), false);
      setStateDelayed('go-e.0.allow_charging', 0, false, parseInt(((0) || "").toString(), 10), false);
      Ladestrom_geplant = 0;
      (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
      }
      });

      on({id: 'go-e.0.allow_charging', change: "ne"}, async function (obj) {
      var value = obj.state.val;
      var oldValue = obj.oldState.val;
      setStateDelayed('Systemvariablen.0.Autoladen.FlashCounter', (getState('Systemvariablen.0.Autoladen.FlashCounter').val + 1), true, parseInt(((0) || "").toString(), 10), false);
      });

      on({id: 'go-e.0.car', change: "ne"}, async function (obj) {
      var value = obj.state.val;
      var oldValue = obj.oldState.val;
      if ((obj.state ? obj.state.val : "") == 4 && (obj.oldState ? obj.oldState.val : "") == 2) {
      setStateDelayed('Systemvariablen.0.Auto_Akku_voll', true, true, parseInt(((0) || "").toString(), 10), false);
      // Batterie voll - Laden beenden
      console.log('Batterie voll');
      Ladung = false;
      setStateDelayed('go-e.0.amperePV', 8, false, parseInt(((0) || "").toString(), 10), false);
      setStateDelayed('go-e.0.allow_charging', 0, false, parseInt(((0) || "").toString(), 10), false);
      Ladestrom_geplant = 0;
      (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
      }
      });

      Was übersehe ich?

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

        Ich hab die Ursache gefunden!

        das Prüfintervall, das im Script irrtümlich ausgeblendet war:
        ladestrom_interval.png

        wird bereits vorher gestartet und läuft durch, was auch beabsichtigt war.
        Allerdings sollten die Werte nur gesetzt werden, wenn manual_override falsch ist.

        Da muss ich noch mal dran schrauben.

        EDIT:
        habe jetzt die letzten beiden falls aus dem Intervall einfach mal darunter gesetzt

        EDIT2:
        scheint wie gewünscht zu klappen.
        Der Ladestrom wat jetzt "eingefroren". kurz den Button "manuell" deaktiviert - beim nächsten triggern sprang der Wertt von 10A auf 6A um. nach erneutem aktivieren hängt es jetzt da fest.

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

          Jetzt habe ich doch noch ein Problem 😞

          ich nutze den go-e Charger, bei dem vom Hersteller gewarnt wird "zu oft" in den Flashspeicher zu schreiben.
          Dieser würde nur etwa 100.000 Schreibzugriffe aushalten.
          Dafür hat er einen weiteren Datenpunkt hinzugefügt, damit bei Überschusssteuerung nicht jedesmal der Flashspeicher beschrieben wird.

          Dieses passiert z.B. beim Schalten des Datenpunktes alw allow_charging, also beim an und ausschalten eines Ladevorganges.

          Hochgerechnet müsste dann der Flashspeicher etwa 30 Jahre halten - gut!

          Jetzt habe ich trotzdem mal zur Überwachung die Änderungen des alw geloggt und mich eben erschrocken, als der bei minimale Nutzung nach 4 Monaten bereits auf 1200 stand.

          alw_go-e.png

          Dann habe ich noch etwas am Skript geändert und den Datenpunkt Flashcounter angefangen zu loggen.

          dabei fiel mir auf, dass dieser Wert beim Abschalten um mehr als 1 hochgezählt wird, und zwar anscheinend unterschiedlich
          flashcounter02.png

          Wenn es "nur" falsch hochgezählt wird ist es vertretbar, aber wenn tatsächlich so vile Schreibvorgänge stattfinden sind es einfach zu viele.

          Wie kann ich herausfinden, wo die Ursache ist?

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

            @homoran sagte: um mehr als 1 hochgezählt wird

            Wenn nicht jedes Hochzählen in die History geschrieben wird, ist es vermutlich ein Laufzeitproblem (schnelles Prellen?). Schreibe den Zählerstand besser bei Skriptstart in eine Variable und zähle diese hoch.

            Bild_2021-07-07_155247.png

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

              Dankje
              @paul53 sagte in :

              Wenn nicht jedes Hochzählen in die History geschrieben wird, ist es vermutlich ein Laufzeitproblem (schnelles Prellen?). Schreibe den Zählerstand besser bei Skriptstart in eine Variable und zähle diese hoch.

              Daran hatte ich auch gedacht, es ist aber anders herum 😞

              Jedes Schalten wird gezählt, allerdings einiges mehrfach.
              Dadurch ergab sich für mich die Frage, ob ggf. auch mehrfach geschrieben wird.

              EDIT:
              Sorry, ich war unpräzise!
              es werden nicht mehrere Einträge erzeugt, sondern in einem Eintrag direkt um 2 oder 3 hochgezählt!

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

                @homoran sagte: sondern in einem Eintrag direkt um 2 oder 3 hochgezählt!

                Genau das führte mich zu meiner Vermutung mit dem Laufzeitproblem.

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

                  @paul53 sagte:

                  Genau das führte mich zu meiner Vermutung mit dem Laufzeitproblem.

                  Danke, dann probiere ich es.

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

                    @paul53 sagte :

                    Genau das führte mich zu meiner Vermutung mit dem Laufzeitproblem.

                    ich hatte ja auch an das Problem mit der asynchronen Verarbeitung gedacht, aber ich verstehe es nicht, dass/warum es dann zu zu hohen Werten kommt.
                    wenn bei schneller Abarabeitung nicht hochgezählt würde, wäre es für mich klar.

                    Aber langer Rede gar kein Sinn: zumindest jetzt hat es mit der Variablen geklappt und es wurde beim Abschalten nur um 1 hochgezählt.

                    Nochmals Danke!
                    ich werde es im Auge behalten.

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

                      @homoran sagte:

                      ich werde es im Auge behalten.

                      @paul53
                      das manuelle Ausschalten über die vis hatte gestern immer nur um 1 hochgezählt.

                      heute hat sich der Ladevorgang per Skript beendet und leider wieder direkt um 3 hochgezählt.
                      flashcounter03.png

                      Ich befürchte daher, dass dann auch tatsächlich 3x geschrieben wird.
                      Da ich aber anscheinend noch einige Bugs drin hatte, hatte ich heute morgen noch einiges verändert und wollte (irgendwann) das Skript komplett anders aufbauen 😞

                      Der früher verlinkte Code passt also nicht mehr.

                      Bei der Suche nach dem Datenpunkt Allow Charging habe ich nur das eine Skript und dort 7 Referenzen gefunden, von denen nur 2 mit einem setState einen Schreibvorgang bewirken sollten.
                      allow_charging.png

                      Habe es jetzt sicherheitshalber mal eine Verzögerung eingebaut.

                      Die Änderung des Datenpunkts triggert auch das Skript, sollte aber IMHO bei false nichts mehr machen:
                      allow_charging02.png

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

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      866
                      Online

                      32.0k
                      Users

                      80.5k
                      Topics

                      1.3m
                      Posts

                      blockly
                      2
                      9
                      133
                      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