Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Scriptoptimierung Solarprognose

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Scriptoptimierung Solarprognose

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

      Hallo, ich habe folgendes Script welches die PV-Vorhersage von Solarprognose für die nächsten 4 Tage abholt.

      const url = 'http://www.solarprognose.de/web/solarprediction/api/v1?_format=json&access-token=xxxxxxxxxxxxxxxxxxxxxx&item=location&id=xxxx&type=hourly';
      const path = '0_userdata.0.Solar.';
      const idLeistung = path + 'Leistung.';
      const idEnergie  = path + 'Energie.';
       
      schedule('4 8,10,12,14,16 * * *', function() {
      
          httpGet(url, function (error, response) {
              if(error) log(error, 'error');
              else {
                  let obj = JSON.parse(response.data);
                  if(obj.status) log('Fehler: ' + obj.status, 'warn');
                  else {
                      let data = obj.data;
                      for(let entry in data) {
                          let time = formatDate(parseInt(entry), 'MM-DD.hh:mm');
                          if(existsState(idLeistung + time)) setState(idLeistung + time, data[entry][0], true);
                          else createState(idLeistung + time, data[entry][0], {
                              type: 'number', 
                              role: 'value', 
                              name: 'Solarleistung ' + formatDate(parseInt(entry), 'DD.MM. hh:mm'),
                              read: true,
                              write: false,
                              unit: 'kW'
                          });
                          if(existsState(idEnergie + time)) setState(idEnergie + time, data[entry][1], true);
                          else createState(idEnergie + time, data[entry][1], {
                              type: 'number', 
                              role: 'value', 
                              name: 'Solarenergie ' + formatDate(parseInt(entry), 'DD.MM. hh:mm'),
                              read: true,
                              write: false,
                              unit: 'kWh'
                          });
                      }
                  }
              }
          });
      });
      

      Das funktioniert soweit auch super, allerdings wird für jeden Tag ein neuer Ordner unter 'Energie' und 'Leistung' angelegt, und die in der Vergangenheit werden nicht automatisch gelöscht.
      Dies führt dazu das ich am Ende des Monats die Ordner immer von Hand löschen muß, damit das nicht unendlich viele werden.

      Ordnerstruktur:

      solarprognose.png

      Leider weiß ich nicht mehr wer der Ersteller des Script ist, sonst hätte ich mich direkt an den gewandt. Vielleicht kann ja hier einer eine Anpassung vornehmen, das die Ordner in der Vergangenheit automatisch gelöscht werden. (Also alles was älter als heute ist.)

      Weiterhin wäre es Super wenn einer eine Idee hätte wie man aus der Struktur für 'Heute' und 'Morgen' den höchsten Ertrag und die Uhrzeit ermitteln kann (gern auch als Blockly)

      1 Reply Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active last edited by

        @icebear sagte in Scriptoptimierung Solarprognose:

        Leider weiß ich nicht mehr wer der Ersteller des Script ist, sonst hätte ich mich direkt an den gewandt. Vielleicht kann ja hier einer eine Anpassung vornehmen, das die Ordner in der Vergangenheit automatisch gelöscht werden. (Also alles was älter als heute ist.)

        na ja eigentlich ist das was da gemacht wird mumpitz... eine historie legt man über entsprechendes adapter (influx oder history oder oder)
        und nicht über Datenpunkte....

        icebear 1 Reply Last reply Reply Quote 0
        • icebear
          icebear @arteck last edited by icebear

          @arteck said in Scriptoptimierung Solarprognose:

          na ja eigentlich ist das was da gemacht wird mumpitz... eine historie legt man über entsprechendes adapter (influx oder history oder oder)
          und nicht über Datenpunkte....

          Da bin ich ja ganz bei dir, nur leider fehlt mir die Kenntnis, um das anzupassen. Mich interessieren eigentlich nur die Ordner, die die Werte für 'Heute' und die nächsten drei Tage enthalten.

          1 Reply Last reply Reply Quote 0
          • arteck
            arteck Developer Most Active last edited by arteck

            @icebear

            kommst du damit besser klar

            const url = 'http://www.solarprognose.de/web/solarprediction/api/v1?_format=json&access-token=xxxxxxxxxxxxxxxxxxxxxx&item=location&id=xxxx&type=hourly';
            const path = '0_userdata.0.Solar2';
            
            schedule('4 8,10,12,14,16 * * *', function() {
                 abfrage();
            });
            
            function abfrage() {
                httpGet(url, function (error, response) {
                    if (error) {
                        log(error, 'error');
                    }
                    else {
                        let obj = JSON.parse(response.data);
                        dpCreate('', obj.data, 'string');
                        dpFill(obj);
                    }
                });
            }
            
            function dpFill(obj) {
                if (obj.status) { 
                    log('Fehler: ' + obj.status, 'warn');
                } else {
                    let data = obj.data;
                    
                    const outArray = formatAndSplitData(data);
            
                    dpCreate('.heute', outArray.heute);   
                    dpCreate('.morgen', outArray.morgen); 
                    dpCreate('.uebermorgen', outArray.uebermorgen); 
            
                }
            }
            
            
            function formatAndSplitData(data) {
                const SECONDS_IN_A_DAY = 86400;
                const MS_IN_A_SECOND = 1000;
            
                const now = new Date();
                const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
                const tomorrowStart = todayStart + SECONDS_IN_A_DAY * MS_IN_A_SECOND;
                const dayAfterTomorrowStart = tomorrowStart + SECONDS_IN_A_DAY * MS_IN_A_SECOND;
            
                const result = {
                    heute: [],
                    morgen: [],
                    uebermorgen: []
                };
            
                for (const [timestamp, values] of Object.entries(data)) {
                    const ts = Number(timestamp) * MS_IN_A_SECOND; // Convert timestamp to milliseconds
                    const date = new Date(ts);
                    const formattedTime = date.toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" }); // Format as "hh:mm"
            
                    const entry = [formattedTime, ...values];
            
                    if (ts >= todayStart && ts < tomorrowStart) {
                        result.heute.push(entry);
                    } else if (ts >= tomorrowStart && ts < dayAfterTomorrowStart) {
                        result.morgen.push(entry);
                    } else if (ts >= dayAfterTomorrowStart) {
                        result.uebermorgen.push(entry);
                    }
                }
            
                return result;
            }
            
            function dpCreate(text, data, typ) {
                createState(path + text + '.Json', [], false, {
                    name: 'json' + text,
                    type: typ == "string" ? typ : 'array', 
                    role: 'json', 
                    read: true,
                    write: false
                });
            
                setTimeout(function () { 
                    setState(path + text + '.Json', data, true);
                }, 600);
            }
            

            der genereirt nur arrays für heute morgen und übermorgen
            3b2bfd57-0058-41a0-97ff-65c0f3252361-grafik.png

            die kannst du dann im blockly weiterverarbeiten

            icebear Meister Mopper 3 Replies Last reply Reply Quote 0
            • icebear
              icebear @arteck last edited by

              @arteck said in Scriptoptimierung Solarprognose:

              kommst du damit besser klar

              Ersteinmal vielen Dank für deine Hilfe, soweit klappt das schonmal und er hat die JSON in die DP abgelegt.

              Jetzt muß ich mal schauen wie ich die mit Blockly so verarbeite das er mir die höchsten Werte und die Uhrzeit in ein DP schreibt.

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

                @icebear sagte in Scriptoptimierung Solarprognose:

                er hat die JSON in die DP abgelegt.

                wie sieht denn das JSON aus?

                1 Reply Last reply Reply Quote 0
                • icebear
                  icebear last edited by

                  @homoran said in Scriptoptimierung Solarprognose:

                  wie sieht denn das JSON aus?

                  [["06:00",[0,0]],["07:00",[1.077,1.077]],["08:00",[2.167,3.244]],["09:00",[3.308,6.552]],["10:00",[4.04,10.592]],["11:00",[4.29,14.882]],["12:00",[3.934,18.816]],["13:00",[2.361,21.177]],["14:00",[1.77,22.947]],["15:00",[0,22.947]]]
                  

                  Also Uhrzeit dann Leistung und Energie.

                  Also müsste ich ein Blockly haben was mir dann aus der JSON zwei Werte in DP schreibt, hier von heute:

                  DP Uhrzeit 12:00
                  DP Leistung 3.934

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

                    @icebear Screenshot_20241130-170940_Firefox.jpg

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

                      @icebear sagte: DP Uhrzeit 12:00
                      DP Leistung 3.934

                      Das Leistungs-Maximum ist um 11:00 Uhr.

                      Blockly_temp.JPG

                      EDIT: Da die Datenpunkte offenbar vom Typ "array" sind, muss man die Wandlung weglassen, da es der Javascript-Adapter macht.

                      Blockly_temp.JPG

                      1 Reply Last reply Reply Quote 0
                      • icebear
                        icebear @arteck last edited by

                        @arteck said in Scriptoptimierung Solarprognose:

                        kommst du damit besser klar

                        Soweit funktioniert das Script, allerdings ist mir aufgefallen, das anscheinend in das JSON 'Z-Zeiten' eingetragen werden.
                        Da, wenn man mal reinschaut die Zeiten mit den höchsten Erträgen um zwei Stunden nach vorne verschoben sind.

                        Ich denke nicht das um 11:00L Uhr der höchste Ertrag zu erwarten ist.

                        [["06:00",[0,0]],["07:00",[0.435,0.435]],["08:00",[1.472,1.907]],["09:00",[2.19,4.097]],["10:00",[2.819,6.916]],["11:00",[3.486,10.402]],["12:00",[3.202,13.604]],["13:00",[2.175,15.779]],["14:00",[0.953,16.732]],["15:00",[0,16.732]]]
                        
                        arteck 1 Reply Last reply Reply Quote 0
                        • arteck
                          arteck Developer Most Active @icebear last edited by arteck

                          @icebear jetzt wo du es sagst... ziehmal das script nochmal

                          ich hab aber auch die ausgabe geändert .. so kann man es direkt im JSON Table widget nutzen

                          [["07:00",0,0],["08:00",0.291,0.291],["09:00",1.333,1.624],["10:00",2.62,4.244],["11:00",3.213,7.457],["12:00",3.677,11.134],["13:00",3.686,14.82],["14:00",3.247,18.067],["15:00",1.353,19.42],["16:00",0,19.42]]
                          

                          4ccdfd9b-fe5f-4c47-ac27-3cfcc0b42af9-grafik.png

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

                            @arteck sagte: die ausgabe geändert

                            Damit vereinfacht sich auch das Blockly zur Ermittlung des Leistungsmaximums.

                            Blockly_temp.JPG

                            1 Reply Last reply Reply Quote 0
                            • icebear
                              icebear last edited by

                              @arteck
                              @paul53

                              Super vielen Dank für eure Hilfe, soweit ich jetzt getestet hab funktioniert das ganze jetzt so wie ich mir das vorgestellt hab.

                              Also nochmal vielen Dank!!!!

                              1 Reply Last reply Reply Quote 0
                              • Meister Mopper
                                Meister Mopper @arteck last edited by

                                @arteck sagte in Scriptoptimierung Solarprognose:

                                kommst du damit besser klar

                                Ich habe das Skript mal hier implementiert, bekomme aber für uebermorgen keine Ergebnisse, obwohl ich heute bei solarprognose.de die Prognose von 2 auf 3 Tage erhöht habe.

                                f92496a6-a19d-409f-9e10-12d5a78c69ea-grafik.png

                                Hast Du eine Idee, woran das liegen könnte, und was hast Du da eingetragen?

                                752b8346-7d67-4e43-8217-b670907f2732-grafik.png

                                arteck 1 Reply Last reply Reply Quote 0
                                • arteck
                                  arteck Developer Most Active @Meister Mopper last edited by arteck

                                  @meister-mopper ich weiss nicht wann die die Daten für welchen Tag zur verfügung stellen..

                                  1bccc4e2-f126-48b8-b6a5-cefbce1d1143-grafik.png

                                  icebear 1 Reply Last reply Reply Quote 0
                                  • icebear
                                    icebear @arteck last edited by

                                    @arteck

                                    Ich glaub du mußt auch nochmal nach dem Script schauen, weil ich bei 'übermorgen' drei Tage im JSON drin stehen hab.

                                    [["08:00",0,0],["09:00",0.237,0.237],["10:00",2.297,2.534],["11:00",2.928,5.462],["12:00",1.611,7.073],["13:00",1.399,8.472],["14:00",2.316,10.788],["15:00",0.543,11.331],["16:00",0,11.331],["07:00",0,0],["08:00",0.004,0.004],["09:00",0.157,0.161],["10:00",0.443,0.604],["11:00",0.641,1.245],["12:00",0.731,1.976],["13:00",0.726,2.702],["14:00",0.65,3.352],["15:00",0.429,3.781],["16:00",0,3.781],["08:00",0,0],["09:00",0.144,0.144],["10:00",0.443,0.587],["11:00",0.614,1.201],["12:00",0.702,1.903],["13:00",0.699,2.602],["14:00",0.59,3.192],["15:00",0.396,3.588],["16:00",0,3.588]]
                                    

                                    Ist mir erst gar nicht aufgefallen.

                                    1 Reply Last reply Reply Quote 0
                                    • arteck
                                      arteck Developer Most Active last edited by

                                      @icebear poste mal den JSON aus dem Hauptordner

                                      icebear 1 Reply Last reply Reply Quote 0
                                      • icebear
                                        icebear @arteck last edited by

                                        @arteck said in Scriptoptimierung Solarprognose:

                                        poste mal den JSON aus dem Hauptordner

                                        {"1733468400":[0,0],"1733472000":[0.144,0.144],"1733475600":[0.443,0.587],"1733479200":[0.668,1.255],"1733482800":[0.702,1.957],"1733486400":[0.753,2.71],"1733490000":[0.63,3.34],"1733493600":[0.56,3.9],"1733497200":[0,3.9],"1733551200":[0,0],"1733554800":[0.144,0.144],"1733558400":[0.21,0.354],"1733562000":[0.443,0.797],"1733565600":[0.614,1.411],"1733569200":[1.962,3.373],"1733572800":[1.775,5.148],"1733576400":[0.951,6.099],"1733580000":[1.068,7.167],"1733583600":[0,7.167],"1733637600":[0,0],"1733641200":[0.048,0.048],"1733644800":[0.157,0.205],"1733648400":[0.506,0.711],"1733652000":[3.037,3.748],"1733655600":[3.281,7.029],"1733659200":[2.798,9.827],"1733662800":[2.275,12.102],"1733666400":[1.092,13.194],"1733670000":[0,13.194],"1733727600":[0,0],"1733731200":[0.144,0.144],"1733734800":[0.443,0.587],"1733738400":[0.641,1.228],"1733742000":[0.761,1.989],"1733745600":[0.78,2.769],"1733749200":[0.65,3.419],"1733752800":[0.421,3.84],"1733756400":[0,3.84],"1733814000":[0,0],"1733817600":[0.144,0.144],"1733821200":[0.443,0.587],"1733824800":[0.614,1.201],"1733828400":[0.702,1.903],"1733832000":[0.699,2.602],"1733835600":[0.59,3.192],"1733839200":[0.396,3.588],"1733842800":[0,3.588]}
                                        
                                        1 Reply Last reply Reply Quote 0
                                        • First post
                                          Last post

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        940
                                        Online

                                        31.6k
                                        Users

                                        79.5k
                                        Topics

                                        1.3m
                                        Posts

                                        5
                                        18
                                        571
                                        Loading More Posts
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                        The ioBroker Community 2014-2023
                                        logo