Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Erste Schritte beim Scripten - Einsteigerfrage

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.6k

Erste Schritte beim Scripten - Einsteigerfrage

Geplant Angeheftet Gesperrt Verschoben JavaScript
43 Beiträge 6 Kommentatoren 3.6k Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • D Doppellhelix

    Hallo,

    das Script hat leider noch einen kleinen Fehler drin.

    Nochmal eine kurze Funktionsbeschreibung:

    Bei Sonnenaufgang wird gecheckt, wieviel Sonnenertrag die PV Anlage erwartet.
    Liegt der Ertrag über 20000, wird die Ladeleistung für den Battereispeicher zu laden auf 10 gedrosselt, und die Variable reducedCharging auf true gesetzt.
    Um 11 Uhr wird die Ladeleistung auf 2000 angehoben.
    Wenn keine 20000 zu erwarten sind, bleibts beim Standartwert 10600.

    Das Problem ist, dass scheinbar immer um 11 Uhr auf 2000 gestellt wird. Und das, obwohl reducedCharging false ist.

    Als Beispiel gestern und heute.
    Ich bekam eine Telegram Nachricht, dass die 20000 nicht zu erwarten sind.
    Um 11Uhr bekam ich dann die Nachricht, dass mit 2000 geladen wird.
    Die Ladeleistung steht auch tatsächlich auf 2000 aber die Variable reducedCharging steht auf false.

    Hat jemand eine Idee, was da falsch läuft?

    var reducedCharging = getState('0_userdata.0.reducedCharging'/*reducedCharging*/).val; 
    console.info('reduced charging is '+reducedCharging);
    
    schedule({astro: "sunrise"}, function () {
        var msgText = "Akkustand bei Sonnenaufgang: " + getState('modbus.0.inputRegisters.13022_Battery_level_'/*Batteriekapazität*/).val + "%";
        var forecast = getState('pvforecast.0.summary.energy.today'/*Geschätzte Energie (heute)*/).val;
         if (forecast > 20000) {
            setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10);
            //setState('mqtt.0.evcc.site.prioritySoc'/*evcc/site/prioritySoc*/, 0);
            setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
            setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
        } else {
             setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
             //setState('mqtt.0.evcc.site.prioritySoc'/*evcc/site/prioritySoc*/, 30);
             setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort mit voller Leistung");
             setState('0_userdata.0.reducedCharging'/*reducedCharging*/, false);
        }
    
        log(msgText);
        setState('telegram.0.communicate.response', msgText);
        });
    
    
    schedule({hour: 11, minute: 0}, function () {
        if (reducedCharging) {
            setState('telegram.0.communicate.response', "Starte laden des Akkus mit 2 kW");
            log("Set max_charge_power to 2kW");
            setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 2000);
            //setState('mqtt.0.evcc.site.prioritySoc'/*evcc/site/prioritySoc*/, 30);
        }
    });
    
    
    paul53P Offline
    paul53P Offline
    paul53
    schrieb am zuletzt editiert von paul53
    #25

    @doppellhelix sagte: Hat jemand eine Idee, was da falsch läuft?

    Du schreibst zwar zum Sonnenaufgang den Datenpunkt "0_userdata.0.reducedCharging", setzt aber nicht die Variable reducedCharging, die um 11:00 Uhr geprüft wird. Siehe Zeile 14 in meinem Vorschlag.

    Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
    Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

    D 1 Antwort Letzte Antwort
    0
    • paul53P paul53

      @doppellhelix sagte: Hat jemand eine Idee, was da falsch läuft?

      Du schreibst zwar zum Sonnenaufgang den Datenpunkt "0_userdata.0.reducedCharging", setzt aber nicht die Variable reducedCharging, die um 11:00 Uhr geprüft wird. Siehe Zeile 14 in meinem Vorschlag.

      D Offline
      D Offline
      Doppellhelix
      schrieb am zuletzt editiert von
      #26

      @paul53 said in Erste Schritte beim Scripten - Einsteigerfrage:

      @doppellhelix sagte: Hat jemand eine Idee, was da falsch läuft?

      Du schreibst zwar zum Sonnenaufgang den Datenpunkt "0_userdata.0.reducedCharging", setzt aber nicht die Variable reducedCharging, die um 11:00 Uhr geprüft wird.

      Wird das nicht in Zeile 11 gemacht?

      setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
      
      paul53P T 2 Antworten Letzte Antwort
      0
      • D Doppellhelix

        @paul53 said in Erste Schritte beim Scripten - Einsteigerfrage:

        @doppellhelix sagte: Hat jemand eine Idee, was da falsch läuft?

        Du schreibst zwar zum Sonnenaufgang den Datenpunkt "0_userdata.0.reducedCharging", setzt aber nicht die Variable reducedCharging, die um 11:00 Uhr geprüft wird.

        Wird das nicht in Zeile 11 gemacht?

        setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
        
        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #27

        @doppellhelix sagte: Wird das nicht in Zeile 11 gemacht?

        Nein, es wird nur der DP geschrieben, aber nicht die Variable gesetzt.

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        D 1 Antwort Letzte Antwort
        0
        • D Doppellhelix

          @paul53 said in Erste Schritte beim Scripten - Einsteigerfrage:

          @doppellhelix sagte: Hat jemand eine Idee, was da falsch läuft?

          Du schreibst zwar zum Sonnenaufgang den Datenpunkt "0_userdata.0.reducedCharging", setzt aber nicht die Variable reducedCharging, die um 11:00 Uhr geprüft wird.

          Wird das nicht in Zeile 11 gemacht?

          setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
          
          T Nicht stören
          T Nicht stören
          ticaki
          schrieb am zuletzt editiert von
          #28

          @doppellhelix

          Wie schon erwähnt - Variable setzen Variable schreiben - nicht Variable setzen Wert schreiben.

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          1 Antwort Letzte Antwort
          0
          • paul53P paul53

            @doppellhelix sagte: Wird das nicht in Zeile 11 gemacht?

            Nein, es wird nur der DP geschrieben, aber nicht die Variable gesetzt.

            D Offline
            D Offline
            Doppellhelix
            schrieb am zuletzt editiert von
            #29

            @paul53 said in Erste Schritte beim Scripten - Einsteigerfrage:

            @doppellhelix sagte: Wird das nicht in Zeile 11 gemacht?

            Nein, es wird nur der DP geschrieben, aber nicht die Variable gesetzt.

            Boah, ich werde kirre..... :grin:
            Ist das nicht das Selbe?

            z.b. in Zeile 8, wird mit setState eine Variable auf den Wert 10 gesetzt.
            Das funktioniert.
            Warum funktioniert das nicht in der Zeile 11?

            Bitte erklärs mir.

            HomoranH AsgothianA 2 Antworten Letzte Antwort
            0
            • D Doppellhelix

              @paul53 said in Erste Schritte beim Scripten - Einsteigerfrage:

              @doppellhelix sagte: Wird das nicht in Zeile 11 gemacht?

              Nein, es wird nur der DP geschrieben, aber nicht die Variable gesetzt.

              Boah, ich werde kirre..... :grin:
              Ist das nicht das Selbe?

              z.b. in Zeile 8, wird mit setState eine Variable auf den Wert 10 gesetzt.
              Das funktioniert.
              Warum funktioniert das nicht in der Zeile 11?

              Bitte erklärs mir.

              HomoranH Nicht stören
              HomoranH Nicht stören
              Homoran
              Global Moderator Administrators
              schrieb am zuletzt editiert von
              #30

              @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

              Ist das nicht das Selbe?

              nicht bei ioBroker

              Datenpunkte enthalten "dauerhaft" gespeicherte Werte, die dem ganzen ioBroker Universum zur Verfügung stehen.

              Variablen existieten nur in dem Skript, und das auch nur bis zum Neustart

              kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

              D 1 Antwort Letzte Antwort
              0
              • HomoranH Homoran

                @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                Ist das nicht das Selbe?

                nicht bei ioBroker

                Datenpunkte enthalten "dauerhaft" gespeicherte Werte, die dem ganzen ioBroker Universum zur Verfügung stehen.

                Variablen existieten nur in dem Skript, und das auch nur bis zum Neustart

                D Offline
                D Offline
                Doppellhelix
                schrieb am zuletzt editiert von Doppellhelix
                #31

                @homoran

                Ok, das ist ein Hinweis, den ich mir aufschreiben sollte.

                Ich denke Zeile 11 ist der Knackpunkt. Aber wie muss es dann richtig sein?
                Ich habe u.a. hier eine Anleitung für den Syntax benutzt, aber da stehts so drin, wie ich es gemacht habe.
                https://www.kreyenborg.koeln/wissensdatenbank/wert-in-datenpunkt-schreiben/

                T 1 Antwort Letzte Antwort
                0
                • D Doppellhelix

                  @paul53 said in Erste Schritte beim Scripten - Einsteigerfrage:

                  @doppellhelix sagte: Wird das nicht in Zeile 11 gemacht?

                  Nein, es wird nur der DP geschrieben, aber nicht die Variable gesetzt.

                  Boah, ich werde kirre..... :grin:
                  Ist das nicht das Selbe?

                  z.b. in Zeile 8, wird mit setState eine Variable auf den Wert 10 gesetzt.
                  Das funktioniert.
                  Warum funktioniert das nicht in der Zeile 11?

                  Bitte erklärs mir.

                  AsgothianA Offline
                  AsgothianA Offline
                  Asgothian
                  Developer
                  schrieb am zuletzt editiert von Asgothian
                  #32

                  @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                  Boah, ich werde kirre..... :grin:
                  Ist das nicht das Selbe?

                  z.b. in Zeile 8, wird mit setState eine Variable auf den Wert 10 gesetzt.
                  Das funktioniert.
                  Warum funktioniert das nicht in der Zeile 11?

                  Bitte erklärs mir.

                  Du vermischt 2 unterschiedliche Dinge:

                  • Variablen (definiert via let oder var im Skript (Z.Bsp. Zeile 1) sind Platzhalter die ausschliesslich innerhalb des Skriptes definiert sind. Sie haben einen (einfachen) Namen nur dann einen Wert wenn dieser nach Start des Skriptes auch 'gesetzt' wird. Diesen kann man einfach direkt einen Wert zuweisen, bzw. den Wert direkt abfragen (Bsp: Zeile 1 für eine Zuweisung, Zeile 10 für eine 'abfrage'
                  • Datenpunkte (oder auch States) - Definiert als Objekte im Objektbaum. Um mit diesen zu Arbeiten musst du einen Aufruf an die Objekt-Datenbank machen (getState) Sie haben verschiedene Eigenschaften:
                    -- die ID, die bei getState, setState oder on genutzt wird
                    -- einen Wert (val) - Siehe Zeile 1, 5 oder 6.
                    -- ...

                  Das was du in Zeile 1 (oder 5,6) machst, ist den Wert eines Datenpunktes in einer Variablen zu speichern. Wohlgemerkt nur den Wert des Datenpunktes zu diesem Zeitpunkt. Es gibt keine verbindung zwischen Variable und Datenpunkt.
                  Was du in Zeile 11 machst ist einen Datenpunkt mit einem neuen Wert zu beschreiben. Dadurch bleibt aber die Variable reducedCharging unverändert. Willst Du diese auch verändern musst du das explizit tun - idealerweise bevor du den Datenpunkt aktualisierst.

                       if (forecast > 20000) {
                          setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10);
                          //setState('mqtt.0.evcc.site.prioritySoc'/*evcc/site/prioritySoc*/, 0);
                           setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                            reducedCharging = true;
                       } else {
                            setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                            //setState('mqtt.0.evcc.site.prioritySoc'/*evcc/site/prioritySoc*/, 30);
                            setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort mit voller Leistung");
                            reducedCharging = false
                       }
                      setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                  

                  Zum Thema was nutz ich wann:

                  1. Variablen:
                  • Variablen verbrauchen etwas Speicher, aber beim Zugriff fast keine Laufzeit.
                  • Variablen werden bei jedem Start es Skripts neu initialisiert. Wenn das Skript dieses nicht tut, dann mit dem Wert undefined
                  • Der code
                  let Testvar = 0;
                  for (let I=1, I<100,i++) {
                     const oldVal = Testvar
                     Testvar = Math.random();
                     console.warn('values: ' + Testvar + '  ' + oldVal)
                  }
                  

                  liefert 100 Zeilen mit jeweils 2 Zahlenpaaren - diese sind immer unterschiedlich.

                  1. Datenpunkte
                  • Datenpunkte liegen in der Objekt-DB. Sie verbrauchen im Skript erst einmal keinen eigenen Speicher - der ist schon in der Objekt-DB enthalten
                  • Der Wert eines Datenpunktes b leibt über Skript- und ioBroker-Neustarts erhalten
                  • der Code
                  let rndVal = 0;
                  for (let I=1; I<100;i++) {
                     rndVal = Math.random();
                     setState('0_userdata.0.floatTest', rndVal )
                     console.warn('values: ' + getState('0_userdata.0.floatTest').val + ' ' + rndVal) 
                  }
                  

                  (Zum Probieren musst du einen Datenpunkt 0_userdata.0.floatTest als typ Numerisch anlegen.)

                  liefert 100 Zahlenpaare, wobei die Zahlen manchmal gleich und manchmal unterschiedlich sind! (Abhängig von Rechenleistung, Größe der Objektdatenbank, etc...)

                  A.

                  ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                  "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                  1 Antwort Letzte Antwort
                  1
                  • D Doppellhelix

                    @homoran

                    Ok, das ist ein Hinweis, den ich mir aufschreiben sollte.

                    Ich denke Zeile 11 ist der Knackpunkt. Aber wie muss es dann richtig sein?
                    Ich habe u.a. hier eine Anleitung für den Syntax benutzt, aber da stehts so drin, wie ich es gemacht habe.
                    https://www.kreyenborg.koeln/wissensdatenbank/wert-in-datenpunkt-schreiben/

                    T Nicht stören
                    T Nicht stören
                    ticaki
                    schrieb am zuletzt editiert von ticaki
                    #33

                    @doppellhelix

                    Deshalb war einer meiner ersten Vorschläge dass du die Variablen raus wirfst - das verwirrt nur am Anfang. Für die 4 mal am Tag oder so, wo du die brauchst, kannst du es auch direkt auf dem State lesen.

                    State sind hier vergleichbar mit Dateisystem und Variablen sind eben ungesicherte Daten.

                    Deshalb

                    // anlegen
                    var daten = true;
                    // oder das ist dann so als wenn du die Datei einmalig einlesen würdest. Danach können andere mit dem state 
                    // machen was sie wollen, du musst ihn erneut lesen wenn du wissen willst was passiert ist.
                    var daten = getState('meineId.daten', daten);
                    
                    // beschreiben
                    daten = false;
                    
                    // speichern
                    setState('meineId.daten', daten);
                    

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    D 1 Antwort Letzte Antwort
                    0
                    • T ticaki

                      @doppellhelix

                      Deshalb war einer meiner ersten Vorschläge dass du die Variablen raus wirfst - das verwirrt nur am Anfang. Für die 4 mal am Tag oder so, wo du die brauchst, kannst du es auch direkt auf dem State lesen.

                      State sind hier vergleichbar mit Dateisystem und Variablen sind eben ungesicherte Daten.

                      Deshalb

                      // anlegen
                      var daten = true;
                      // oder das ist dann so als wenn du die Datei einmalig einlesen würdest. Danach können andere mit dem state 
                      // machen was sie wollen, du musst ihn erneut lesen wenn du wissen willst was passiert ist.
                      var daten = getState('meineId.daten', daten);
                      
                      // beschreiben
                      daten = false;
                      
                      // speichern
                      setState('meineId.daten', daten);
                      
                      D Offline
                      D Offline
                      Doppellhelix
                      schrieb am zuletzt editiert von Doppellhelix
                      #34

                      @ticaki
                      Ja hattest du, aber zu dem Zeitpunkt war ich ja 0 im Thema drinnen und wusste nicht, was du meinstest :-)

                      @Asgothian
                      Danke für die ausführliche Erklärung.
                      Warum unterscheidet man des denn so?
                      Aus der Historie, weil Speicher früher kostbar war? Oder weil Variablen einfach schneller "im Ablauf" sind?

                      AsgothianA 1 Antwort Letzte Antwort
                      0
                      • D Doppellhelix

                        @ticaki
                        Ja hattest du, aber zu dem Zeitpunkt war ich ja 0 im Thema drinnen und wusste nicht, was du meinstest :-)

                        @Asgothian
                        Danke für die ausführliche Erklärung.
                        Warum unterscheidet man des denn so?
                        Aus der Historie, weil Speicher früher kostbar war? Oder weil Variablen einfach schneller "im Ablauf" sind?

                        AsgothianA Offline
                        AsgothianA Offline
                        Asgothian
                        Developer
                        schrieb am zuletzt editiert von Asgothian
                        #35

                        @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                        Warum unterscheidet man des denn so?
                        Aus der Historie, weil Speicher früher kostbar war? Oder weil Variablen einfach schneller "im Ablauf" sind?

                        Es geht nicht um Schneller oder langsamer, sondern um das richtige Werkzeug für die richtige Anwendung.

                        Mit Variablen können viele Dinge getan werden die mit Datenpunkten unhandlich sind und/oder Zeit und Ressourcen kosten.

                        Was ich in dem Post oben nicht klar erwähnt habe:
                        Variablen brauchen primär Speicher als Ressource. Zugriff ist billig. Insbesondere wenn es darum geht Werte aus Datenpunkten in Skripten zu nutzen erhöht die Variable den Speicherbedarf, senkt aber im Gegenzug den Ressourcenverbrauch wenn sie geändert wird.

                        Stell dir das ganze so vor:

                        • Die Variable ist eine Kreidetafel. Willst du den Wert wissen schaust du drauf. Willst du den Ändern wischt du sie aus und schreibst den neuen Wert drauf
                        • Datenpunkte sind Karteikarten in einem Schober. Willst du den Wert wissen schickst Du jemanden mit der ID los die Karte zu holen. Willst du den Wert anpassen musst du jemanden mit einer neuen Karte losschicken um die Karteikarte im Schober auszutauschen
                        • Alles was du dauerhaft erhalten willst muss auf einer Karteikarte im Schober stehen. Nur dann bleibt es erhalten.

                        In deinem Skript ist die Verwendung der Variablen durchaus optional. Der Vorschlag von @ticaki ist nicht schlecht, da der 'gewinn' in deinem Beispiel sehr gering ist.

                        In einem anderen Beispiel sieht das aber dann anders aus:

                        • stell dir vor du hast einen Datenpunkt Energielimit. Damit steuerst du ab wie viel Energieüberschuss du das Auto laden willst.
                        • Jetzt machst du einen Trigger: - jedes mal wenn sich der Energieüberschuss ändert willst du wissen ob er über dem Limit liegt. Wenn du da das Limit jedes mal aus dem Datenpunkt holst ist das schon signifikant mehr Ressourcenverbrauch als das ganze einmal zu holen und in einer Variable abzulegen, mit die du den geänderten Energieüberschuss vergleichen kannst.

                        A.
                        (Ja, das Bild vereinfacht, hilft aber)

                        ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                        "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                        HomoranH 1 Antwort Letzte Antwort
                        2
                        • AsgothianA Asgothian

                          @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                          Warum unterscheidet man des denn so?
                          Aus der Historie, weil Speicher früher kostbar war? Oder weil Variablen einfach schneller "im Ablauf" sind?

                          Es geht nicht um Schneller oder langsamer, sondern um das richtige Werkzeug für die richtige Anwendung.

                          Mit Variablen können viele Dinge getan werden die mit Datenpunkten unhandlich sind und/oder Zeit und Ressourcen kosten.

                          Was ich in dem Post oben nicht klar erwähnt habe:
                          Variablen brauchen primär Speicher als Ressource. Zugriff ist billig. Insbesondere wenn es darum geht Werte aus Datenpunkten in Skripten zu nutzen erhöht die Variable den Speicherbedarf, senkt aber im Gegenzug den Ressourcenverbrauch wenn sie geändert wird.

                          Stell dir das ganze so vor:

                          • Die Variable ist eine Kreidetafel. Willst du den Wert wissen schaust du drauf. Willst du den Ändern wischt du sie aus und schreibst den neuen Wert drauf
                          • Datenpunkte sind Karteikarten in einem Schober. Willst du den Wert wissen schickst Du jemanden mit der ID los die Karte zu holen. Willst du den Wert anpassen musst du jemanden mit einer neuen Karte losschicken um die Karteikarte im Schober auszutauschen
                          • Alles was du dauerhaft erhalten willst muss auf einer Karteikarte im Schober stehen. Nur dann bleibt es erhalten.

                          In deinem Skript ist die Verwendung der Variablen durchaus optional. Der Vorschlag von @ticaki ist nicht schlecht, da der 'gewinn' in deinem Beispiel sehr gering ist.

                          In einem anderen Beispiel sieht das aber dann anders aus:

                          • stell dir vor du hast einen Datenpunkt Energielimit. Damit steuerst du ab wie viel Energieüberschuss du das Auto laden willst.
                          • Jetzt machst du einen Trigger: - jedes mal wenn sich der Energieüberschuss ändert willst du wissen ob er über dem Limit liegt. Wenn du da das Limit jedes mal aus dem Datenpunkt holst ist das schon signifikant mehr Ressourcenverbrauch als das ganze einmal zu holen und in einer Variable abzulegen, mit die du den geänderten Energieüberschuss vergleichen kannst.

                          A.
                          (Ja, das Bild vereinfacht, hilft aber)

                          HomoranH Nicht stören
                          HomoranH Nicht stören
                          Homoran
                          Global Moderator Administrators
                          schrieb am zuletzt editiert von
                          #36

                          @asgothian sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                          Es geht nicht um Schneller oder langsamer,

                          naja, je nach Anwendungsfall schon.

                          @Doppellhelix
                          JS Scripte arbeiten asynchron, dh. sie warten nicht unbedingt auf die Abarbeitung des gerade ausgeführten Befehls, sondern führen direkt den nächsten aus.

                          Wenn jetzt der Bote mit der letzten Karteikarte noch unterwegs ist, hat der, der den Wert nachsehen will, u.U. noch den alten Wert.
                          Hier ist die Kreidetafel die bessere Methode, weil schneller.

                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                          AsgothianA 1 Antwort Letzte Antwort
                          0
                          • HomoranH Homoran

                            @asgothian sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                            Es geht nicht um Schneller oder langsamer,

                            naja, je nach Anwendungsfall schon.

                            @Doppellhelix
                            JS Scripte arbeiten asynchron, dh. sie warten nicht unbedingt auf die Abarbeitung des gerade ausgeführten Befehls, sondern führen direkt den nächsten aus.

                            Wenn jetzt der Bote mit der letzten Karteikarte noch unterwegs ist, hat der, der den Wert nachsehen will, u.U. noch den alten Wert.
                            Hier ist die Kreidetafel die bessere Methode, weil schneller.

                            AsgothianA Offline
                            AsgothianA Offline
                            Asgothian
                            Developer
                            schrieb am zuletzt editiert von Asgothian
                            #37

                            @homoran sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                            naja, je nach Anwendungsfall schon.

                            Den Anwendungsfall wo 3 oder 4 ms wichtig sind würde ich gerne kennenlernen.

                            Ironie aussen vor gelassen - das Problem mit dem Zeitverbrauch ist die Asynchronität - dafür gibt es inzwischen Lösungen im JS adapter. Ich gehe auch davon aus das die Laufzeit zum holen eines States inzwischen so kurz ist das der Effekt nur auf sehr langsamen Systemen sichtbar bleibt.

                            Bleibt die Ressourcenthematik.

                            A.
                            Nachtrag - Der test stammt aus einer älteren Version des JS Adapters - da war das noch so. Inzwischen hat der JS Adapter die Asynchronität über interne promises abgedeckt - der Test geht also schief. Um den OP nicht zu verwirren hier den Code nur hinterm Spoiler:

                            Hier klappt sind die Werte nicht gleich

                            let tmp = 0
                            for (let I=1; I<100;I++) {
                               const rndVal = Math.random();
                               setState('0_userdata.0.floatTest', rndVal);
                               const state = getState('0_userdata.0.floatTest', (err, obj) => { 
                                   console.warn(`values: ${obj.val} ${rndVal} ${(rndVal ==  obj.val)}`) });
                            }
                            

                            Hier sind sie es immer.

                            for (let I=1; I<100;I++) {
                               const rndVal = Math.random();
                               setState('0_userdata.0.floatTest', rndVal);
                               const obj = getState('0_userdata.0.floatTest')
                               console.warn(`values: ${obj.val} ${rndVal} ${(rndVal ==  obj.val)}`);
                            }
                            

                            ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
                            "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

                            HomoranH T 2 Antworten Letzte Antwort
                            0
                            • AsgothianA Asgothian

                              @homoran sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                              naja, je nach Anwendungsfall schon.

                              Den Anwendungsfall wo 3 oder 4 ms wichtig sind würde ich gerne kennenlernen.

                              Ironie aussen vor gelassen - das Problem mit dem Zeitverbrauch ist die Asynchronität - dafür gibt es inzwischen Lösungen im JS adapter. Ich gehe auch davon aus das die Laufzeit zum holen eines States inzwischen so kurz ist das der Effekt nur auf sehr langsamen Systemen sichtbar bleibt.

                              Bleibt die Ressourcenthematik.

                              A.
                              Nachtrag - Der test stammt aus einer älteren Version des JS Adapters - da war das noch so. Inzwischen hat der JS Adapter die Asynchronität über interne promises abgedeckt - der Test geht also schief. Um den OP nicht zu verwirren hier den Code nur hinterm Spoiler:

                              Hier klappt sind die Werte nicht gleich

                              let tmp = 0
                              for (let I=1; I<100;I++) {
                                 const rndVal = Math.random();
                                 setState('0_userdata.0.floatTest', rndVal);
                                 const state = getState('0_userdata.0.floatTest', (err, obj) => { 
                                     console.warn(`values: ${obj.val} ${rndVal} ${(rndVal ==  obj.val)}`) });
                              }
                              

                              Hier sind sie es immer.

                              for (let I=1; I<100;I++) {
                                 const rndVal = Math.random();
                                 setState('0_userdata.0.floatTest', rndVal);
                                 const obj = getState('0_userdata.0.floatTest')
                                 console.warn(`values: ${obj.val} ${rndVal} ${(rndVal ==  obj.val)}`);
                              }
                              

                              HomoranH Nicht stören
                              HomoranH Nicht stören
                              Homoran
                              Global Moderator Administrators
                              schrieb am zuletzt editiert von
                              #38

                              @asgothian sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                              Inzwischen hat der JS Adapter die Asynchronität über interne promises abgedeckt

                              again what learned ;-)
                              auch bei Blockly?

                              kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                              Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                              der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                              1 Antwort Letzte Antwort
                              0
                              • AsgothianA Asgothian

                                @homoran sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                                naja, je nach Anwendungsfall schon.

                                Den Anwendungsfall wo 3 oder 4 ms wichtig sind würde ich gerne kennenlernen.

                                Ironie aussen vor gelassen - das Problem mit dem Zeitverbrauch ist die Asynchronität - dafür gibt es inzwischen Lösungen im JS adapter. Ich gehe auch davon aus das die Laufzeit zum holen eines States inzwischen so kurz ist das der Effekt nur auf sehr langsamen Systemen sichtbar bleibt.

                                Bleibt die Ressourcenthematik.

                                A.
                                Nachtrag - Der test stammt aus einer älteren Version des JS Adapters - da war das noch so. Inzwischen hat der JS Adapter die Asynchronität über interne promises abgedeckt - der Test geht also schief. Um den OP nicht zu verwirren hier den Code nur hinterm Spoiler:

                                Hier klappt sind die Werte nicht gleich

                                let tmp = 0
                                for (let I=1; I<100;I++) {
                                   const rndVal = Math.random();
                                   setState('0_userdata.0.floatTest', rndVal);
                                   const state = getState('0_userdata.0.floatTest', (err, obj) => { 
                                       console.warn(`values: ${obj.val} ${rndVal} ${(rndVal ==  obj.val)}`) });
                                }
                                

                                Hier sind sie es immer.

                                for (let I=1; I<100;I++) {
                                   const rndVal = Math.random();
                                   setState('0_userdata.0.floatTest', rndVal);
                                   const obj = getState('0_userdata.0.floatTest')
                                   console.warn(`values: ${obj.val} ${rndVal} ${(rndVal ==  obj.val)}`);
                                }
                                

                                T Nicht stören
                                T Nicht stören
                                ticaki
                                schrieb am zuletzt editiert von ticaki
                                #39

                                @asgothian sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                                @homoran sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                                naja, je nach Anwendungsfall schon.

                                Den Anwendungsfall wo 3 oder 4 ms wichtig sind würde ich gerne kennenlernen.

                                Ironie aussen vor gelassen - das Problem mit dem Zeitverbrauch ist die Asynchronität - dafür gibt es inzwischen Lösungen im JS adapter. Ich gehe auch davon aus das die Laufzeit zum holen eines States inzwischen so kurz ist das der Effekt nur auf sehr langsamen Systemen sichtbar bleibt.

                                Der State wird meines wissens nach nicht aus der DB sondern aus dem Cache geholt, solange die Option dazu nicht abgeschaltet wird. Das sorgt nur für Probleme wenn du objekte löschst oder erstellst, da hilft dann ein sleep().

                                Nur um das in Zahlen zu packen:

                                128 µs

                                let b = 0;
                                for (let a = 0; a < 10000; a++) {
                                    b += a;
                                }
                                

                                54 ms

                                // b wurde vor dem messen initialisiert
                                for (let a = 0; a < 10000; a++) {
                                    b = getState('0_userdata.0.testNumber').val;
                                    b += a;
                                    setState('0_userdata.0.testNumber', b)
                                }
                                

                                Es ist egal, man schreibt es so das man es später auch nochmal lesen kann.

                                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                Spenden

                                1 Antwort Letzte Antwort
                                0
                                • D Offline
                                  D Offline
                                  Doppellhelix
                                  schrieb am zuletzt editiert von
                                  #40

                                  Jetzt ist es mir klarer.

                                  Wie ich den Thread angefangen habe, war mir der Unterschied ja überhaupt nicht bewusst.
                                  Deswegen stand ich wohl auch gewaltig auf dem Schlauch und hab mich mehrmals gefragt, was ihr da überhaupt redet :grin:
                                  Jetzt macht das alles einen Sinn.

                                  1 Antwort Letzte Antwort
                                  1
                                  • paul53P paul53

                                    @doppellhelix sagte: Script wie ein SPS Programm arbeitet und das Script in einer Schleife stetig durchlaufen wird.

                                    Nein, Javascript wird nicht in einer Schleife durchlaufen, sondern arbeitet Ereignis gesteuert. Ereignisse sind u.a. DP-Trigger, Zeitpläne, Timer.

                                    Das Skript etwas übersichtlicher und mit weniger setState():

                                    const idMaxPower = 'modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/;
                                    const idForecast = 'pvforecast.0.summary.energy.today'/*Geschätzte Energie (heute)*/;
                                    const idBatt     = 'modbus.0.inputRegisters.13022_Battery_level_'/*Batteriekapazität*/;
                                    const idTelegram = 'telegram.0.communicate.response';
                                    const idReduced  = '0_userdata.0.reducedCharging'/*reducedCharging*/;
                                    
                                    var reducedCharging = getState(idReduced).val;
                                    log('reduced charging is ' + reducedCharging);
                                     
                                    schedule({astro: "sunrise"}, function () {
                                        let msgText = "Akkustand bei Sonnenaufgang: " + getState(idBatt).val + " %\n";
                                        const forecast = getState(idForecast).val;
                                        let maxPower = 10600;
                                        reducedCharging = forecast > 20000;
                                        if (reducedCharging) {
                                            maxPower = 100;
                                            msgText += forecast + ' Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr';
                                        } else {
                                            msgText += forecast + ' Wh Ertrag erwartet. Lade Akku sofort';
                                        }
                                        log(msgText);
                                        setState(idMaxPower, maxPower); 
                                        setState(idTelegram, msgText);
                                        setState(idReduced, reducedCharging, true);
                                    });
                                     
                                    schedule('0 11 * * *', function () {
                                        if (reducedCharging) {
                                            setState(idTelegram, "Starte laden des Akkus mit 2 kW");
                                            log("Set max_charge_power to 2kW");
                                            setState(idMaxPower, 2000);
                                        }
                                    });
                                    
                                    fuzzy1955F Online
                                    fuzzy1955F Online
                                    fuzzy1955
                                    schrieb am zuletzt editiert von
                                    #41

                                    @paul53
                                    Hallo Paul,

                                    dein Vorschlag mit den CONST-Variablen der DP-Definition ist wirklich in vielen Skripten eine super Möglichkeit, um die Übersichtlichkeit zu gewährleisten! Bei Änderungen in Datenpunktnamen braucht man nur am Anfang des Skripts zu schauen.

                                    :blush: Fuzzy

                                    Raspberry PI5 mit Linux Debian 13 (Trixie), IoBroker v7.7.19, VIS-2, MariaDB (MySQL)
                                    Shellies: 1G4, 1MiniG3, PlusI4DC, PlusPlugS, Pro0110PM. Modbus: Waveshare Relay 8 Channels, Waveshare RS485-TO-ETH.
                                    PV: 10 kWp Module, 2 x Deye WR SUN-10K, 2 x 10 kWh MeritSun LiFe Speicher, KEBA P30 Wallbox, Fronius Wattpilot home 11

                                    1 Antwort Letzte Antwort
                                    0
                                    • D Offline
                                      D Offline
                                      Doppellhelix
                                      schrieb am zuletzt editiert von
                                      #42

                                      Guten Morgen,

                                      durch einen kleinen Hardwarefehler, musste ich mit iobroker auf neue Hardware umziehen.
                                      Dieses Script hier, habe ich einfach per Copy+Paste rüber kopiert.
                                      Die 0_userdata.0.reducedCharging habe ich angelegt.

                                      Dennoch läuft das Script nicht richtig:

                                      var reducedCharging = getState('0_userdata.0.reducedCharging'/*reducedCharging*/).val; 
                                      console.info('reduced charging is '+reducedCharging);
                                      
                                      schedule({astro: "sunrise"}, function () {
                                          var msgText = "Akkustand bei Sonnenaufgang: " + getState('modbus.0.inputRegisters.13022_Battery_level_'/*Batteriekapazität*/).val + "%";
                                          var forecast = getState('pvforecast.0.summary.energy.today'/*Geschätzte Energie (heute)*/).val;
                                          if (forecast > 20000) {
                                              setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10);
                                              setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 10W bis 11 Uhr");
                                              reducedCharging = true;
                                          } else {
                                               setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                                               setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort mit voller Leistung");
                                               reducedCharging = false;
                                          }
                                          setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                                          log(msgText);
                                          setState('telegram.0.communicate.response', msgText);
                                          });
                                      
                                      
                                      schedule({hour: 11, minute: 0}, function () {
                                          if (reducedCharging) {
                                              setState('telegram.0.communicate.response', "Starte laden des Akkus mit 1 kW");
                                              log("Set max_charge_power to 1kW");
                                              setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 1000);
                                                 }
                                      });
                                      
                                      

                                      Bei Sonnenaufgang wird alles gecheckt.
                                      Heute morgen ist der erwartete Ertrag (pvforecast.0.sumary.energy.today bei 20083
                                      Dennoch sagt das Script:

                                      "Akkustand bei Sonnenaufgang: 66,3%"
                                      "20083 Wh Ertrag erwartet. Lade Akku sofort mit voller Leistung."

                                      Auch die reduced Charging wurde nicht gesetzt.

                                      Ich habe auch @paul53 "optimiertes" Script 1zu1 eingefügt uns ausprobiert.
                                      Auch dieses macht den gleichen "Fehler"

                                      Könnt Ihr bitte noch einmal nachschauen, was hier gerade falsch läuft?

                                      Vielen Dank.

                                      D 1 Antwort Letzte Antwort
                                      0
                                      • D Doppellhelix

                                        Guten Morgen,

                                        durch einen kleinen Hardwarefehler, musste ich mit iobroker auf neue Hardware umziehen.
                                        Dieses Script hier, habe ich einfach per Copy+Paste rüber kopiert.
                                        Die 0_userdata.0.reducedCharging habe ich angelegt.

                                        Dennoch läuft das Script nicht richtig:

                                        var reducedCharging = getState('0_userdata.0.reducedCharging'/*reducedCharging*/).val; 
                                        console.info('reduced charging is '+reducedCharging);
                                        
                                        schedule({astro: "sunrise"}, function () {
                                            var msgText = "Akkustand bei Sonnenaufgang: " + getState('modbus.0.inputRegisters.13022_Battery_level_'/*Batteriekapazität*/).val + "%";
                                            var forecast = getState('pvforecast.0.summary.energy.today'/*Geschätzte Energie (heute)*/).val;
                                            if (forecast > 20000) {
                                                setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10);
                                                setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 10W bis 11 Uhr");
                                                reducedCharging = true;
                                            } else {
                                                 setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                                                 setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort mit voller Leistung");
                                                 reducedCharging = false;
                                            }
                                            setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                                            log(msgText);
                                            setState('telegram.0.communicate.response', msgText);
                                            });
                                        
                                        
                                        schedule({hour: 11, minute: 0}, function () {
                                            if (reducedCharging) {
                                                setState('telegram.0.communicate.response', "Starte laden des Akkus mit 1 kW");
                                                log("Set max_charge_power to 1kW");
                                                setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 1000);
                                                   }
                                        });
                                        
                                        

                                        Bei Sonnenaufgang wird alles gecheckt.
                                        Heute morgen ist der erwartete Ertrag (pvforecast.0.sumary.energy.today bei 20083
                                        Dennoch sagt das Script:

                                        "Akkustand bei Sonnenaufgang: 66,3%"
                                        "20083 Wh Ertrag erwartet. Lade Akku sofort mit voller Leistung."

                                        Auch die reduced Charging wurde nicht gesetzt.

                                        Ich habe auch @paul53 "optimiertes" Script 1zu1 eingefügt uns ausprobiert.
                                        Auch dieses macht den gleichen "Fehler"

                                        Könnt Ihr bitte noch einmal nachschauen, was hier gerade falsch läuft?

                                        Vielen Dank.

                                        D Offline
                                        D Offline
                                        Doppellhelix
                                        schrieb am zuletzt editiert von
                                        #43

                                        @doppellhelix

                                        Nach langer Sucherei habe ich es gefunden.
                                        Ich hatte im Adapter pv.forecast nicht den Haken gesetzt bei: "Werte in W statt kW."

                                        :face_palm:

                                        1 Antwort Letzte Antwort
                                        0
                                        Antworten
                                        • In einem neuen Thema antworten
                                        Anmelden zum Antworten
                                        • Älteste zuerst
                                        • Neuste zuerst
                                        • Meiste Stimmen


                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        941

                                        Online

                                        32.5k

                                        Benutzer

                                        81.6k

                                        Themen

                                        1.3m

                                        Beiträge
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                        ioBroker Community 2014-2025
                                        logo
                                        • Anmelden

                                        • Du hast noch kein Konto? Registrieren

                                        • Anmelden oder registrieren, um zu suchen
                                        • Erster Beitrag
                                          Letzter Beitrag
                                        0
                                        • Home
                                        • Aktuell
                                        • Tags
                                        • Ungelesen 0
                                        • Kategorien
                                        • Unreplied
                                        • Beliebt
                                        • GitHub
                                        • Docu
                                        • Hilfe