Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

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

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    17
    1
    552

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    5.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.4k

Erste Schritte beim Scripten - Einsteigerfrage

Scheduled Pinned Locked Moved JavaScript
43 Posts 6 Posters 4.2k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Doppellhelix

    Vielen Dank für deine Hilfe.

    Ich habe jetzt mal eine Variable vom Typ Logik angelegt:
    0_userdata.0.reducedCharging

    Im Script habe ich 2 Zeilen hinzugefügt:

    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*/, 100);
           //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
           setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
           reducedCharging = true;
           setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
       } else {
            setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
            //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
            setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
            reducedCharging = false;
            setState('0_userdata.0.reducedCharging'/*reducedCharging*/, false);
       }
    
    

    Aktuell sollte der Wert true sein.
    Es wird mir aber angezeigt:

    Wert:
    falsch
    Typ:
    boolean
    Zeitstempel:
    vor 13 Minuten
    Bestätigt:
    Bestätigt (true)
    Zuletzt geändert:
    vor 13 Minuten
    Qualität:
    0x20 - substitute initial value
    Von:
    system.adapter.admin.0
    Benutzer:
    system.user.admin
    

    Was mache ich noch falsch?

    Gruß Helix

    AsgothianA Offline
    AsgothianA Offline
    Asgothian
    Developer
    wrote on last edited by
    #4

    @doppellhelix du hast nur 50% der Anweisung erfüllt. Neben dem anlegen des datenpunktes musst du den Wert der Variable mit setState da auch rein schreiben wenn du sie geändert hast

    A.

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

    1 Reply Last reply
    0
    • D Offline
      D Offline
      Doppellhelix
      wrote on last edited by
      #5

      @doppellhelix said in Erste Schritte beim Scripten - Einsteigerfrage:
      Habe ich das nicht gemacht, mit dieser Zeile?

      setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
      

      Habe noch ein Problem.
      Gerade 11 Uhr und nichts ist passiert.
      Hatte erwartet, dass um 11 Uhr
      das hier passiert:

      setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 2000);
      
      1 Reply Last reply
      0
      • D Doppellhelix

        Vielen Dank für deine Hilfe.

        Ich habe jetzt mal eine Variable vom Typ Logik angelegt:
        0_userdata.0.reducedCharging

        Im Script habe ich 2 Zeilen hinzugefügt:

        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*/, 100);
               //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
               setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
               reducedCharging = true;
               setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
           } else {
                setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                reducedCharging = false;
                setState('0_userdata.0.reducedCharging'/*reducedCharging*/, false);
           }
        
        

        Aktuell sollte der Wert true sein.
        Es wird mir aber angezeigt:

        Wert:
        falsch
        Typ:
        boolean
        Zeitstempel:
        vor 13 Minuten
        Bestätigt:
        Bestätigt (true)
        Zuletzt geändert:
        vor 13 Minuten
        Qualität:
        0x20 - substitute initial value
        Von:
        system.adapter.admin.0
        Benutzer:
        system.user.admin
        

        Was mache ich noch falsch?

        Gruß Helix

        T Do not disturb
        T Do not disturb
        ticaki
        wrote on last edited by ticaki
        #6

        @doppellhelix
        Wenn du einen Variable veröffentlichen willst, nutze diese als Schreibwert - wenn das Skript komplexer wird übersiehst du vielleicht sonst den Wert in setState anzupassen.

        reducedCharging = false;
        setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
        

        Dein Auszug sieht nach einem unberührten Datenpunkt aus, das wird wohl deshalb sein, weil sonnenaufgang schon etwas her ist :D

        EDIT: in deinem Auszug steht nix von 11 uhr

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        D 1 Reply Last reply
        0
        • T ticaki

          @doppellhelix
          Wenn du einen Variable veröffentlichen willst, nutze diese als Schreibwert - wenn das Skript komplexer wird übersiehst du vielleicht sonst den Wert in setState anzupassen.

          reducedCharging = false;
          setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
          

          Dein Auszug sieht nach einem unberührten Datenpunkt aus, das wird wohl deshalb sein, weil sonnenaufgang schon etwas her ist :D

          EDIT: in deinem Auszug steht nix von 11 uhr

          D Offline
          D Offline
          Doppellhelix
          wrote on last edited by
          #7

          @ticaki
          Danke
          Ja, das macht Sinn.

          Die Sache mit 11 Uhr steht im obersten ersten Thread.

          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('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
              }
          
          T AsgothianA 2 Replies Last reply
          0
          • D Doppellhelix

            @ticaki
            Danke
            Ja, das macht Sinn.

            Die Sache mit 11 Uhr steht im obersten ersten Thread.

            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('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                }
            
            T Do not disturb
            T Do not disturb
            ticaki
            wrote on last edited by
            #8

            @doppellhelix

            Das hab ich gesehen, aber hast du auch bei 11:00 die neuen setState() eingefügt? Und wenn die das problem sind, muß du doch auch den code dort posten - Glaskugel sind da nicht sehr zuverlässig :)

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            1 Reply Last reply
            0
            • D Doppellhelix

              @ticaki
              Danke
              Ja, das macht Sinn.

              Die Sache mit 11 Uhr steht im obersten ersten Thread.

              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('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                  }
              
              AsgothianA Offline
              AsgothianA Offline
              Asgothian
              Developer
              wrote on last edited by Asgothian
              #9

              @doppellhelix Und wenn du das genau liest wirst du feststellen das um 11 nu dann etwas passiert wenn die Variable reducedCharging auf wahr steht. Du initialisierst sie aber mit falsch. Deswegen ist um 11 nix passiert.

              A.

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

              T D 2 Replies Last reply
              0
              • AsgothianA Asgothian

                @doppellhelix Und wenn du das genau liest wirst du feststellen das um 11 nu dann etwas passiert wenn die Variable reducedCharging auf wahr steht. Du initialisierst sie aber mit falsch. Deswegen ist um 11 nix passiert.

                A.

                T Do not disturb
                T Do not disturb
                ticaki
                wrote on last edited by
                #10

                @asgothian
                Bei einem normalen setState() würde sich das hier ändern:

                Qualität:
                0x20 - substitute initial value
                

                Da ist nix drauf geschrieben worden.

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                1 Reply Last reply
                0
                • AsgothianA Asgothian

                  @doppellhelix Und wenn du das genau liest wirst du feststellen das um 11 nu dann etwas passiert wenn die Variable reducedCharging auf wahr steht. Du initialisierst sie aber mit falsch. Deswegen ist um 11 nix passiert.

                  A.

                  D Offline
                  D Offline
                  Doppellhelix
                  wrote on last edited by
                  #11

                  Also erstmal,

                  danke euch beiden für eure Geduld mit mir :-)
                  Ich möchte das unbedingt verstehen, weil ich schon von Berufswegen mich dafür interessiere. Da sind es aber eher SPS Programme.

                  @asgothian
                  Versteh nicht, wo ich die reducedCharging auf falsch setze?

                  Zum Ablauf:

                  Bei Sonnenaufgang wird gecheckt, ob 20000 erreicht werden.
                  Dem ist heute so, als wird reducedCharging auf wahr gestellt.
                  Zeile 11

                  Dann passiert bis 11 Uhr nix.
                  Hier wird in Zeile 27 gecheckt, ob reucedCharging ansteht.
                  Das sollte es ja eigentlich noch. ISt ja nix anderes dazwischen passiert oder überseh ich was.

                  Hie nochmal der komplette code, damit wir wieder alle gleich sind :-)

                  var reducedCharging = false;
                  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*/, 100);
                          //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
                          setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                          reducedCharging = true;
                          setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                      } else {
                           setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                           //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                           setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                           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 2 kW");
                          log("Set max_charge_power to 2kW");
                          setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 2000);
                          //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                      }
                  });
                  
                  
                  
                  paul53P T AsgothianA 3 Replies Last reply
                  0
                  • D Doppellhelix

                    Also erstmal,

                    danke euch beiden für eure Geduld mit mir :-)
                    Ich möchte das unbedingt verstehen, weil ich schon von Berufswegen mich dafür interessiere. Da sind es aber eher SPS Programme.

                    @asgothian
                    Versteh nicht, wo ich die reducedCharging auf falsch setze?

                    Zum Ablauf:

                    Bei Sonnenaufgang wird gecheckt, ob 20000 erreicht werden.
                    Dem ist heute so, als wird reducedCharging auf wahr gestellt.
                    Zeile 11

                    Dann passiert bis 11 Uhr nix.
                    Hier wird in Zeile 27 gecheckt, ob reucedCharging ansteht.
                    Das sollte es ja eigentlich noch. ISt ja nix anderes dazwischen passiert oder überseh ich was.

                    Hie nochmal der komplette code, damit wir wieder alle gleich sind :-)

                    var reducedCharging = false;
                    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*/, 100);
                            //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
                            setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                            reducedCharging = true;
                            setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                        } else {
                             setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                             //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                             setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                             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 2 kW");
                            log("Set max_charge_power to 2kW");
                            setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 2000);
                            //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                        }
                    });
                    
                    
                    
                    paul53P Offline
                    paul53P Offline
                    paul53
                    wrote on last edited by paul53
                    #12

                    @doppellhelix sagte: Versteh nicht, wo ich die reducedCharging auf falsch setze?

                    Beim Skriptstart in Zeile 1. Nach jeder Änderung im Skript wird das Skript neu gestartet. Wenn es nach SA passiert, ist um 11 Uhr die Variable false.

                    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

                    HomoranH D 2 Replies Last reply
                    0
                    • D Doppellhelix

                      Also erstmal,

                      danke euch beiden für eure Geduld mit mir :-)
                      Ich möchte das unbedingt verstehen, weil ich schon von Berufswegen mich dafür interessiere. Da sind es aber eher SPS Programme.

                      @asgothian
                      Versteh nicht, wo ich die reducedCharging auf falsch setze?

                      Zum Ablauf:

                      Bei Sonnenaufgang wird gecheckt, ob 20000 erreicht werden.
                      Dem ist heute so, als wird reducedCharging auf wahr gestellt.
                      Zeile 11

                      Dann passiert bis 11 Uhr nix.
                      Hier wird in Zeile 27 gecheckt, ob reucedCharging ansteht.
                      Das sollte es ja eigentlich noch. ISt ja nix anderes dazwischen passiert oder überseh ich was.

                      Hie nochmal der komplette code, damit wir wieder alle gleich sind :-)

                      var reducedCharging = false;
                      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*/, 100);
                              //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
                              setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                              reducedCharging = true;
                              setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                          } else {
                               setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                               //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                               setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                               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 2 kW");
                              log("Set max_charge_power to 2kW");
                              setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 2000);
                              //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                          }
                      });
                      
                      
                      
                      T Do not disturb
                      T Do not disturb
                      ticaki
                      wrote on last edited by ticaki
                      #13

                      @doppellhelix
                      Also stimmt doch allles :)

                      um 11 Uhr wird die Variable reducedCharging nur abgefragt und nicht geschrieben.
                      Beim start des Skriptes solltest du die Variable mit dem Datenpunkt initialisieren.

                      Oh Paul war schon da :)

                      EDIT: Naja ich würde die Variable ganz streichen und jedesmal getState() oder setState() verwenden, so als wenns ein fremder Datenpunkt ist. Sind ja nur 2 abfragen und 1 set pro Tag.

                      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                      Spenden

                      1 Reply Last reply
                      0
                      • paul53P paul53

                        @doppellhelix sagte: Versteh nicht, wo ich die reducedCharging auf falsch setze?

                        Beim Skriptstart in Zeile 1. Nach jeder Änderung im Skript wird das Skript neu gestartet. Wenn es nach SA passiert, ist um 11 Uhr die Variable false.

                        HomoranH Do not disturb
                        HomoranH Do not disturb
                        Homoran
                        Global Moderator Administrators
                        wrote on last edited by
                        #14

                        @paul53 sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                        Beim Skriptstart in Zeile 1. Nach jeder Änderung im Skript wird das Skript neu gestartet. Wenn es nach SA passiert ist um 11 Uhr die Variable false.

                        @Doppellhelix
                        schreib den aktuellen Zustand in einen eigenen Datenpunkt und lies den bei Skriptstart aus

                        kein Support per PN! - Fragen im Forum stellen -
                        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                        Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton im Header. Danke!
                        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                        1 Reply Last reply
                        0
                        • paul53P paul53

                          @doppellhelix sagte: Versteh nicht, wo ich die reducedCharging auf falsch setze?

                          Beim Skriptstart in Zeile 1. Nach jeder Änderung im Skript wird das Skript neu gestartet. Wenn es nach SA passiert, ist um 11 Uhr die Variable false.

                          D Offline
                          D Offline
                          Doppellhelix
                          wrote on last edited by
                          #15

                          @paul53

                          Ahhh, das erklärt es natürlich.
                          Das ist aber dann ziemlich unelegant. Dann dürfte man ja nie am Script arbeiten, wenn man nicht bis zum nächsten Sonnenaufgang warten will.

                          Ich bin davon ausgegangen, dass so ein Script wie ein SPS Programm arbeitet und das Script in einer Schleife stetig durchlaufen wird.

                          Wie bekommt man das denn besser hin?

                          HomoranH T paul53P 3 Replies Last reply
                          0
                          • D Doppellhelix

                            @paul53

                            Ahhh, das erklärt es natürlich.
                            Das ist aber dann ziemlich unelegant. Dann dürfte man ja nie am Script arbeiten, wenn man nicht bis zum nächsten Sonnenaufgang warten will.

                            Ich bin davon ausgegangen, dass so ein Script wie ein SPS Programm arbeitet und das Script in einer Schleife stetig durchlaufen wird.

                            Wie bekommt man das denn besser hin?

                            HomoranH Do not disturb
                            HomoranH Do not disturb
                            Homoran
                            Global Moderator Administrators
                            wrote on last edited by
                            #16

                            @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                            Wie bekommt man das denn besser hin?

                            @homoran sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                            @Doppellhelix
                            schreib den aktuellen Zustand in einen eigenen Datenpunkt und lies den bei Skriptstart aus

                            kein Support per PN! - Fragen im Forum stellen -
                            Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                            Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton im Header. Danke!
                            der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                            1 Reply Last reply
                            0
                            • D Doppellhelix

                              @paul53

                              Ahhh, das erklärt es natürlich.
                              Das ist aber dann ziemlich unelegant. Dann dürfte man ja nie am Script arbeiten, wenn man nicht bis zum nächsten Sonnenaufgang warten will.

                              Ich bin davon ausgegangen, dass so ein Script wie ein SPS Programm arbeitet und das Script in einer Schleife stetig durchlaufen wird.

                              Wie bekommt man das denn besser hin?

                              T Do not disturb
                              T Do not disturb
                              ticaki
                              wrote on last edited by
                              #17

                              @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                              @paul53

                              Ahhh, das erklärt es natürlich.
                              Das ist aber dann ziemlich unelegant. Dann dürfte man ja nie am Script arbeiten, wenn man nicht bis zum nächsten Sonnenaufgang warten will.

                              Ich bin davon ausgegangen, dass so ein Script wie ein SPS Programm arbeitet und das Script in einer Schleife stetig durchlaufen wird.

                              Wie bekommt man das denn besser hin?

                              Den Edit wirst du nicht gelesen habe 2 Möglichkeiten

                              • initialisiere die Variable mit getState()
                              • streiche die Variable und verwende überall getState() und setState()

                              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                              Spenden

                              1 Reply Last reply
                              0
                              • D Doppellhelix

                                Also erstmal,

                                danke euch beiden für eure Geduld mit mir :-)
                                Ich möchte das unbedingt verstehen, weil ich schon von Berufswegen mich dafür interessiere. Da sind es aber eher SPS Programme.

                                @asgothian
                                Versteh nicht, wo ich die reducedCharging auf falsch setze?

                                Zum Ablauf:

                                Bei Sonnenaufgang wird gecheckt, ob 20000 erreicht werden.
                                Dem ist heute so, als wird reducedCharging auf wahr gestellt.
                                Zeile 11

                                Dann passiert bis 11 Uhr nix.
                                Hier wird in Zeile 27 gecheckt, ob reucedCharging ansteht.
                                Das sollte es ja eigentlich noch. ISt ja nix anderes dazwischen passiert oder überseh ich was.

                                Hie nochmal der komplette code, damit wir wieder alle gleich sind :-)

                                var reducedCharging = false;
                                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*/, 100);
                                        //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
                                        setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                                        reducedCharging = true;
                                        setState('0_userdata.0.reducedCharging'/*reducedCharging*/, reducedCharging);
                                    } else {
                                         setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                                         //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                                         setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                                         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 2 kW");
                                        log("Set max_charge_power to 2kW");
                                        setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 2000);
                                        //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                                    }
                                });
                                
                                
                                
                                AsgothianA Offline
                                AsgothianA Offline
                                Asgothian
                                Developer
                                wrote on last edited by
                                #18

                                @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                                Versteh nicht, wo ich die reducedCharging auf falsch setze?
                                Zum Ablauf:
                                Bei Sonnenaufgang wird gecheckt, ob 20000 erreicht werden.
                                Dem ist heute so, als wird reducedCharging auf wahr gestellt.
                                Zeile 11
                                Dann passiert bis 11 Uhr nix.
                                Hier wird in Zeile 27 gecheckt, ob reucedCharging ansteht.
                                Das sollte es ja eigentlich noch. ISt ja nix anderes dazwischen passiert oder überseh ich was.
                                Hie nochmal der komplette code, damit wir wieder alle gleich sind

                                Da ist dein Denkfehler:

                                • du setzt reducedCharging hier auf falsch:
                                  var reducedCharging = false;
                                • wenn das Skript zum Sonnenaufgang läuft wird zum Sonnenaufgang der Wert von reducedCharging verändert. Das wäre heute passiert wenn Du das Skript nicht danach neu gestartet hättest. Ergo ist reducedCharging immer noch falsch

                                Vielleicht generell mal als Denkhilfe

                                Variablen sind:

                                • nur in dem Kontext bekannt in dem sie definiert sind. Der Kontext kann dabei das Skript sein, kann aber auch nur ein Teil des Skriptes sein:
                                const scriptglobal = true;
                                
                                if (23<11) {
                                  const scriptlocal = true;
                                  console.info('A global: ' + scriptglobal + ' local: ' + scriptlocal)
                                }
                                
                                console.info('B global: ' + scriptglobal + ' local: ' + scriptlocal)
                                

                                liefert:
                                A global: true local: true
                                B global: true local: undefined

                                • variablen belegen wenig Speicherplatz und sind nur aktiv wenn das Skript läuft
                                • auf variablen kann schnell und einfach zugegriffen werden (lesen und schreiben)

                                Datenpunkte sind:

                                • persistent - ihre Werte bleiben selbst über den Neustart des ioBroker erhalten
                                • global - sie sind nicht an einzelne Skripte gebunden
                                • zugriff erfordert mehr Code, da die Werte aus der Datenpunkt-Datenbank geholt / dahin geschrieben werden müssen. Das macht Datenpunkte weniger 'einfach' zu nutzen
                                • Zugriff kostet ggf. Zeit, so das der Code:
                                let value = Math.random();
                                setState('0_userdata.myState', value);
                                if (value == getState('0_userdata.myState').val console.info('gleich') else console.info('ungleich')
                                

                                nicht bei jedem Durchlauf die gleiche Meldung ins Log schreibt.

                                In deinem Code solltest Du die Variable also mit dem Wert des Datenpunktes vorbelegen, damit sie Synchron zum Datenpunkt ist.

                                var reducedCharging = getState('0_userdata.0.reducedCharging'/*reducedCharging*/).val;
                                

                                A.

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

                                1 Reply Last reply
                                0
                                • D Offline
                                  D Offline
                                  Doppellhelix
                                  wrote on last edited by Doppellhelix
                                  #19

                                  Puuuhhh, und ich dachte nimm dir mal schnell dieses kleine Script und pass es an :-)
                                  Das war wohl sehr naiv.

                                  Aber mitlerweile habe ich schon einiges gelernt. :+1:

                                  Ich bin mir noch nicht sicher, ob die Variable in den Datenpunkt geschrieben wird..
                                  Habe jetzt alles auf Datenpunkte umgeschrieben.
                                  Hoffe ich zumíndest.

                                  //var reducedCharging = false;
                                  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*/, 100);
                                          //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
                                          setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                                          //reducedCharging = true;
                                          setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
                                      } else {
                                           setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                                           //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                                           setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                                           setState('0_userdata.0.reducedCharging'/*reducedCharging*/, false);
                                      }
                                  
                                      log(msgText);
                                      setState('telegram.0.communicate.response', msgText);
                                      });
                                  
                                  
                                  schedule({hour: 12, 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('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                                      }
                                  });
                                  
                                  
                                  

                                  EDIT:
                                  hatte das Script ja auf 12 Uhr abgeändert und das hat funktioniert :clap:

                                  AsgothianA 1 Reply Last reply
                                  0
                                  • D Doppellhelix

                                    Puuuhhh, und ich dachte nimm dir mal schnell dieses kleine Script und pass es an :-)
                                    Das war wohl sehr naiv.

                                    Aber mitlerweile habe ich schon einiges gelernt. :+1:

                                    Ich bin mir noch nicht sicher, ob die Variable in den Datenpunkt geschrieben wird..
                                    Habe jetzt alles auf Datenpunkte umgeschrieben.
                                    Hoffe ich zumíndest.

                                    //var reducedCharging = false;
                                    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*/, 100);
                                            //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 0);
                                            setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Reduziere Ladeleistung auf 100W bis 11 Uhr");
                                            //reducedCharging = true;
                                            setState('0_userdata.0.reducedCharging'/*reducedCharging*/, true);
                                        } else {
                                             setState('modbus.0.holdingRegisters.33046_Max_Charging_Power'/*Max Ladeleistung*/, 10600);
                                             //setState('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                                             setState('telegram.0.communicate.response', forecast + "Wh Ertrag erwartet. Lade Akku sofort");
                                             setState('0_userdata.0.reducedCharging'/*reducedCharging*/, false);
                                        }
                                    
                                        log(msgText);
                                        setState('telegram.0.communicate.response', msgText);
                                        });
                                    
                                    
                                    schedule({hour: 12, 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('evcc.0.control.prioritySoc'/*prioritySoc*/, 30);
                                        }
                                    });
                                    
                                    
                                    

                                    EDIT:
                                    hatte das Script ja auf 12 Uhr abgeändert und das hat funktioniert :clap:

                                    AsgothianA Offline
                                    AsgothianA Offline
                                    Asgothian
                                    Developer
                                    wrote on last edited by
                                    #20

                                    @doppellhelix sagte in Erste Schritte beim Scripten - Einsteigerfrage:

                                    Puuuhhh, und ich dachte nimm dir mal schnell dieses kleine Script und pass es an
                                    Das war wohl sehr naiv.

                                    Ja, war es. gerade wenn du fremde Skripte übernimmst solltest Du dir vorher die Doku anschauen, damit du verstehst was die einzelnen Befehle wirklich tun.

                                    Habe jetzt alles auf Datenpunkte umgeschrieben.
                                    Hoffe ich zumíndest.

                                    Das sieht erst einmal soweit gut aus.

                                    Ob es das macht was du willst lässt sich so nicht sagen - dazu müssten wir wissen was das Ziel ist. :)

                                    A.

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

                                    1 Reply Last reply
                                    0
                                    • D Doppellhelix

                                      @paul53

                                      Ahhh, das erklärt es natürlich.
                                      Das ist aber dann ziemlich unelegant. Dann dürfte man ja nie am Script arbeiten, wenn man nicht bis zum nächsten Sonnenaufgang warten will.

                                      Ich bin davon ausgegangen, dass so ein Script wie ein SPS Programm arbeitet und das Script in einer Schleife stetig durchlaufen wird.

                                      Wie bekommt man das denn besser hin?

                                      paul53P Offline
                                      paul53P Offline
                                      paul53
                                      wrote on last edited by paul53
                                      #21

                                      @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);
                                          }
                                      });
                                      

                                      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

                                      fuzzy1955F 1 Reply Last reply
                                      0
                                      • D Offline
                                        D Offline
                                        Doppellhelix
                                        wrote on last edited by
                                        #22

                                        @Asgothian

                                        Im Grunde genommen soll das Script dafür sorgen, dass die PV Anlage nicht in die 70% Abregelung kommt.
                                        Wenn gutes Wetter ist (pvForecast > 20000 W), dann wird das wahrscheinlich passieren.
                                        Im normalfall wird mit den ersten Sonnenstrahlen der Speicher geladen. Dieser ist um 10 Uhr voll und ab dann wird voll eingespeist.
                                        Indem das Speicherladen verhindert und erst ab 11 Uhr freigegeben wird, umgeht man die 70% Abregelung. Alles über 70% geht dann in den Speicher und nicht ins Netz.

                                        @paul53
                                        Klasse. Danke dir.
                                        Das nehme ich gerne mit, sobald ich weiß was da genau passiert.

                                        @alle anderen.
                                        Danke für eure Einsatz.

                                        T 1 Reply Last reply
                                        0
                                        • D Doppellhelix

                                          @Asgothian

                                          Im Grunde genommen soll das Script dafür sorgen, dass die PV Anlage nicht in die 70% Abregelung kommt.
                                          Wenn gutes Wetter ist (pvForecast > 20000 W), dann wird das wahrscheinlich passieren.
                                          Im normalfall wird mit den ersten Sonnenstrahlen der Speicher geladen. Dieser ist um 10 Uhr voll und ab dann wird voll eingespeist.
                                          Indem das Speicherladen verhindert und erst ab 11 Uhr freigegeben wird, umgeht man die 70% Abregelung. Alles über 70% geht dann in den Speicher und nicht ins Netz.

                                          @paul53
                                          Klasse. Danke dir.
                                          Das nehme ich gerne mit, sobald ich weiß was da genau passiert.

                                          @alle anderen.
                                          Danke für eure Einsatz.

                                          T Do not disturb
                                          T Do not disturb
                                          ticaki
                                          wrote on last edited by ticaki
                                          #23

                                          @doppellhelix

                                          Nicht das es immer stimmt, aber chatgpt kann man für das erklären von Code eigentlich ganz gut gebrauchen und dann mit den gewonnen Fachbegriffen suchen, ob es nicht mal wieder nur viel Worte gemacht hat. :)

                                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                          Spenden

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          369

                                          Online

                                          32.7k

                                          Users

                                          82.5k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe