Skip to content
  • 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
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben

NEWS

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

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

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

Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
awattarbilligbörseepexgünstigstrompreisstündlichtibber
156 Beiträge 24 Kommentatoren 38.0k Aufrufe 33 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 Offline
    D Offline
    dieterh
    schrieb am zuletzt editiert von
    #41

    Hallo zusammen - ich wünsche Euch allen ein gutes neues Jahr.

    Thomas, ich habe die letzten Tage damit verbracht, mich in dein Werk einzuarbeiten.
    Ich ziehe meinen imaginären Hut, denn Du hast ja wirklich alle Register gezogen und ein sehr komplexes Werk geschaffen.
    Ich habe bereits begonnen es auf meine Belange anzupassen und lerne auch jeden Tag dazu. Ich muss gestehen, dass ich die letzten Jahre meine Hausautomatisierung auf SYMCON aufgebaut habe, dort werden die Scripte in PHP geschrieben.

    Nun aber noch eine Beobachtung die ich die letzten Stunden gemacht habe:

    Obwohl Tibber bereits die Daten vom nächsten Tag zur Verfügung gestellt hat, wurden diese nicht von deinem Tibber-Script übernommen. Ich hatte die Abholzeit 15:00 eingetragen und das Script ist dann wohl auch gelaufen, denn es hat die Werte für heute übernommen - für morgen aber alles mit (NULL) gefüllt. Damit fehlten dann auch die Berechnungen für die günstigsten Stunden.
    Hast Du eine Idee, was das sein könnte?

    M 1 Antwort Letzte Antwort
    0
    • D dieterh

      Hallo zusammen - ich wünsche Euch allen ein gutes neues Jahr.

      Thomas, ich habe die letzten Tage damit verbracht, mich in dein Werk einzuarbeiten.
      Ich ziehe meinen imaginären Hut, denn Du hast ja wirklich alle Register gezogen und ein sehr komplexes Werk geschaffen.
      Ich habe bereits begonnen es auf meine Belange anzupassen und lerne auch jeden Tag dazu. Ich muss gestehen, dass ich die letzten Jahre meine Hausautomatisierung auf SYMCON aufgebaut habe, dort werden die Scripte in PHP geschrieben.

      Nun aber noch eine Beobachtung die ich die letzten Stunden gemacht habe:

      Obwohl Tibber bereits die Daten vom nächsten Tag zur Verfügung gestellt hat, wurden diese nicht von deinem Tibber-Script übernommen. Ich hatte die Abholzeit 15:00 eingetragen und das Script ist dann wohl auch gelaufen, denn es hat die Werte für heute übernommen - für morgen aber alles mit (NULL) gefüllt. Damit fehlten dann auch die Berechnungen für die günstigsten Stunden.
      Hast Du eine Idee, was das sein könnte?

      M Offline
      M Offline
      MikeRow
      schrieb am zuletzt editiert von
      #42

      @dieterh Hallo, hatte ich auch erst gedacht. Die Preise für morgen waren aber auf der API auch noch nicht da. Die Preise für morgen werden seit ca 15:30 angeboten. Lass dein Script nochmal laufen. Die Preise sollten dann aktualisiert werden.

      D 1 Antwort Letzte Antwort
      0
      • M MikeRow

        @dieterh Hallo, hatte ich auch erst gedacht. Die Preise für morgen waren aber auf der API auch noch nicht da. Die Preise für morgen werden seit ca 15:30 angeboten. Lass dein Script nochmal laufen. Die Preise sollten dann aktualisiert werden.

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

        @mikerow said in Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben:

        @dieterh Hallo, hatte ich auch erst gedacht. Die Preise für morgen waren aber auf der API auch noch nicht da. Die Preise für morgen werden seit ca 15:30 angeboten. Lass dein Script nochmal laufen. Die Preise sollten dann aktualisiert werden.

        @mikerow - du hast recht, um 16:00 Uhr waren dann auch die Daten von morgen drin.
        Eine Sache stört mich jedoch: nach dem Lauf zeigte 'Geringster_Preis' einen Wert von heute Morgen um 03:00 Uhr - also aus der Vergangenheit.
        Vielleicht sollten wir versuchen, die Funktion 'guenstigster_preis' von der aktuellen Stunde bis Mitternacht einzugrenzen?

        M 1 Antwort Letzte Antwort
        0
        • D dieterh

          @mikerow said in Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben:

          @dieterh Hallo, hatte ich auch erst gedacht. Die Preise für morgen waren aber auf der API auch noch nicht da. Die Preise für morgen werden seit ca 15:30 angeboten. Lass dein Script nochmal laufen. Die Preise sollten dann aktualisiert werden.

          @mikerow - du hast recht, um 16:00 Uhr waren dann auch die Daten von morgen drin.
          Eine Sache stört mich jedoch: nach dem Lauf zeigte 'Geringster_Preis' einen Wert von heute Morgen um 03:00 Uhr - also aus der Vergangenheit.
          Vielleicht sollten wir versuchen, die Funktion 'guenstigster_preis' von der aktuellen Stunde bis Mitternacht einzugrenzen?

          M Offline
          M Offline
          MikeRow
          schrieb am zuletzt editiert von MikeRow
          #44

          @dieterh Ich denke da muss @ThomKast was zu sagen. Betrachtet auf den laufenden Tag wäre es ok. In seinem Script zieht er die Preise bei Tageswechsel um. Dann müsste eine Neuermittlung der günstigsten Stunden stattfinden. Er hat das vermutlich berücksichtigt.
          Ich werde das aber für mich etwas anders machen. Ich zapfe die Daten von Thomas an und schaue ob der aktuelle Preis über oder unter dem Durchschnitt ist.
          Ähnlich wie in diesem Scriptable Script für IOS. 21985ce8-22ad-48bd-bffa-dcdd1a59196d-image.png
          Für meine Frau ist das besser zu erfassen.

          1 Antwort Letzte Antwort
          0
          • D Offline
            D Offline
            dieterh
            schrieb am zuletzt editiert von
            #45

            @dieterh said in Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben:
            @ThomKast,
            folgendes ist mir aufgefallen: ich habe heute die Tibber Files um 15:30 Uhr gezogen und nach dem Lauf zeigte 'Geringster_Preis' einen Wert von heute Morgen um 03:00 Uhr - also aus der Vergangenheit.
            Es sieht auch so aus, als ob 'Preis_Hysterese_Stunden' die Werte von heute Morgen zeigt und nicht die Werte von heute Nacht, bzw. morgen früh.

            Vielleicht sollten wir versuchen, die Funktion 'guenstigster_preis' von der aktuellen Stunde bis Mitternacht einzugrenzen, um realistischere Werte zu erhalten?

            T 1 Antwort Letzte Antwort
            0
            • D dieterh

              @dieterh said in Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben:
              @ThomKast,
              folgendes ist mir aufgefallen: ich habe heute die Tibber Files um 15:30 Uhr gezogen und nach dem Lauf zeigte 'Geringster_Preis' einen Wert von heute Morgen um 03:00 Uhr - also aus der Vergangenheit.
              Es sieht auch so aus, als ob 'Preis_Hysterese_Stunden' die Werte von heute Morgen zeigt und nicht die Werte von heute Nacht, bzw. morgen früh.

              Vielleicht sollten wir versuchen, die Funktion 'guenstigster_preis' von der aktuellen Stunde bis Mitternacht einzugrenzen, um realistischere Werte zu erhalten?

              T Offline
              T Offline
              ThomKast
              schrieb am zuletzt editiert von ThomKast
              #46

              @dieterh

              Hallo zusammen. Ich bin diese Woche unterwegs und kann leider nur sehr eingeschränkt antworten...

              Die günstigste Stunde ist erst mal nur eine Information. Ob diese in der Vergangenheit liegt ist daher unerheblich. Eigentlich diente mir der Datenpunkt nur zur Kontrolle.
              Wichtiger ist der geringste Preis, der zu dieser Stunde gilt, denn auf diesen wird der prozentuale Aufschlag "Hysterese" gerechnet. Alle Stunden, in denen die Preise kleiner-gleich dieses Preises sind, werden als günstigeStunden ausgewiesen. Und zu diesen Stunden "Preis_Hysterese_Stunden" wird die epex-Freigabe erteilt. Dies können dann auch wieder Stunden in der Zukunft am selben Tag sein.
              Nachts um 00:02 erfolgt der Umzug der tomorrow-Werte auf today und es erfolgt erneut die Bestimmung des geringsten Preises und,..., von vorn...

              Ja, die Preise stehen teils erst zum 1600 oder später zur Verfügung. Darauf habe ich keinen Einfluss. Einfach die Abholzeit etwas später wählen. Es geht ja nix verloren 😉.

              Beste Grüße, Thomas

              1 Antwort Letzte Antwort
              0
              • T Offline
                T Offline
                ThomKast
                schrieb am zuletzt editiert von
                #47

                @dieterh @MikeRow

                Anbei das Feedback von TIBBER zur verspäteten Bereitstellung der Preise...

                Screenshot_20230103_142822_Aqua Mail.jpg

                M 2 Antworten Letzte Antwort
                0
                • T ThomKast

                  @dieterh @MikeRow

                  Anbei das Feedback von TIBBER zur verspäteten Bereitstellung der Preise...

                  Screenshot_20230103_142822_Aqua Mail.jpg

                  M Offline
                  M Offline
                  MikeRow
                  schrieb am zuletzt editiert von
                  #48

                  @thomkast thx

                  1 Antwort Letzte Antwort
                  0
                  • T ThomKast

                    @dieterh @MikeRow

                    Anbei das Feedback von TIBBER zur verspäteten Bereitstellung der Preise...

                    Screenshot_20230103_142822_Aqua Mail.jpg

                    M Offline
                    M Offline
                    MikeRow
                    schrieb am zuletzt editiert von
                    #49

                    @thomkast zu früh gefreut. Nix da um 15:45 Uhr a68d12e6-945d-4b9a-96b3-769cdee5b2b2-image.png

                    W 1 Antwort Letzte Antwort
                    0
                    • M MikeRow

                      @thomkast zu früh gefreut. Nix da um 15:45 Uhr a68d12e6-945d-4b9a-96b3-769cdee5b2b2-image.png

                      W Offline
                      W Offline
                      Wesertaler
                      schrieb am zuletzt editiert von
                      #50

                      @mikerow

                      Leider hat mein 16:30 gestern auch nicht funktioniert 😞

                      M 1 Antwort Letzte Antwort
                      0
                      • W Wesertaler

                        @mikerow

                        Leider hat mein 16:30 gestern auch nicht funktioniert 😞

                        M Offline
                        M Offline
                        MikeRow
                        schrieb am zuletzt editiert von
                        #51

                        @wesertaler Jo, hab ich auch bemerkt. Die Preise waren ca 18:00 Uhr da

                        1 Antwort Letzte Antwort
                        0
                        • S Offline
                          S Offline
                          shellyrulestheworld
                          schrieb am zuletzt editiert von
                          #52

                          @ThomKast ganz tolle Arbeit, genau das was ich gesucht habe. Ich würde gerne die Scripte verwenden, aber erst einmal ohne Tibber.

                          Gehe ich richtig in der Annahme, dass es am besten wäre die neuen Scripts zu verwenden und die Auswahl auf PV Überschuss zu stellen? Tibber sollte mich dann nicht tangieren oder muss der Adapter installiert sein? (Welcher Adapter wird von dir verwendet, der "alte" oder der "neue"?

                          Oder ist es dann sinnvoller die "alten" Scripte aus dem früheren Beitrag zu verwenden?

                          S T 2 Antworten Letzte Antwort
                          0
                          • S shellyrulestheworld

                            @ThomKast ganz tolle Arbeit, genau das was ich gesucht habe. Ich würde gerne die Scripte verwenden, aber erst einmal ohne Tibber.

                            Gehe ich richtig in der Annahme, dass es am besten wäre die neuen Scripts zu verwenden und die Auswahl auf PV Überschuss zu stellen? Tibber sollte mich dann nicht tangieren oder muss der Adapter installiert sein? (Welcher Adapter wird von dir verwendet, der "alte" oder der "neue"?

                            Oder ist es dann sinnvoller die "alten" Scripte aus dem früheren Beitrag zu verwenden?

                            S Online
                            S Online
                            Schimi
                            schrieb am zuletzt editiert von
                            #53

                            @shellyrulestheworld

                            Es muss garkein Adapter installiert werden....

                            Das läuft ganz auf "Scriptebene".... im Script kannst du deine Token von Tibber eintragen.... ich vermute, wenn du es nicht machst, spuckt er im Log nen fehler aus aber PV funktioniert... (reine annahme)

                            1 Antwort Letzte Antwort
                            1
                            • S shellyrulestheworld

                              @ThomKast ganz tolle Arbeit, genau das was ich gesucht habe. Ich würde gerne die Scripte verwenden, aber erst einmal ohne Tibber.

                              Gehe ich richtig in der Annahme, dass es am besten wäre die neuen Scripts zu verwenden und die Auswahl auf PV Überschuss zu stellen? Tibber sollte mich dann nicht tangieren oder muss der Adapter installiert sein? (Welcher Adapter wird von dir verwendet, der "alte" oder der "neue"?

                              Oder ist es dann sinnvoller die "alten" Scripte aus dem früheren Beitrag zu verwenden?

                              T Offline
                              T Offline
                              ThomKast
                              schrieb am zuletzt editiert von
                              #54

                              @shellyrulestheworld

                              Hallo, das freut mich. Vielen Dank 🤗

                              Der neuere Artikel hat das aktuelle Script. Und da ich nur an dem aktuellen Script weiterarbeite, wäre es besser dieses zu verwenden.´
                              Wie @Schimi geschrieben hat, kommt kein Adapter zum Einsatz. Im Script ist es dafür nötig Dein Tibber-Token einzutragen.

                              Neidisch bin ich ja schon..., denn ich würde auch mal gerne wieder PV-Überschuss verwenden können. Bei uns regnet es gefühlt seit Wochen und Erträge von rund 8 kWh werden direkt verfrühstückt. Wann wird's mal wieder richtig Sommer... :man-shrugging: 😊

                              S 1 Antwort Letzte Antwort
                              2
                              • M MikeRow

                                @thomkast Hi, ja es gibt einen alten und neuen Tibber Adapter.

                                Für den alten Adapter (wird wohl nicht weiterentwickelt) gibt es einen brauchbaren JSON Chart.

                                16c08f01-c5ee-45e1-889f-ed9e11f2b39e-image.png


                                var myName = "tibber.createchartdata";

                                var logOn = false; // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden immer ausgegeben.
                                var forceCreation = false; // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden)

                                var tibberPricesToday = "tibber.0.priceInfo.today."; // mit . am Ende!
                                var tibberPricesTomorrow = "tibber.0.priceInfo.tomorrow."; // mit . am Ende!

                                var tibberStartsAt = "startsAt";
                                var tibberTotal = "total";

                                // Datenpunkte anlegen:
                                // -----------------------------------------------------------------------------
                                var idChartData = "tibber.prices.chartData"; // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
                                createState(idChartData, '[{"label":"15","value":"25.2","dataColor":"#ffffff"},{"label":"16","value":"28.8","dataColor":"#ffffff"},{"label":"17","value":3"5.2","dataColor":"#ffffff"},{"label":"18","value":"33.2","dataColor":"#ffffff"},{"label":"19","value":"20.2","dataColor":"#ffffff"}]', forceCreation, {
                                name: 'Chart-Data Price Forecast',
                                desc: 'Chart-Data Price Forecast',
                                type: 'string',
                                role: 'value'
                                });

                                // Datenpunkte anlegen:
                                // -----------------------------------------------------------------------------
                                var idBarChartData = "tibber.prices.barChartData"; // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
                                createState(idBarChartData, '[{"label":"15","value":"25.2","dataColor":"#ffffff"},{"label":"16","value":"28.8","dataColor":"#ffffff"},{"label":"17","value":3"5.2","dataColor":"#ffffff"},{"label":"18","value":"33.2","dataColor":"#ffffff"},{"label":"19","value":"20.2","dataColor":"#ffffff"}]', forceCreation, {
                                name: 'Bar Chart-Data Price Forecast',
                                desc: 'Bar Chart-Data Price Forecast',
                                type: 'string',
                                role: 'value'
                                });

                                createBarChartData();

                                // Cron-Job, zum Stundenwechsel
                                // Stundenwechsel, Ausführen immer um *:00:10
                                schedule('10 0 * * * *', function () {createBarChartData()});

                                function createBarChartData () {
                                if(logOn) console.log(myName + " Stundenwechsel");

                                let barChart = [];
                                
                                var jetzt = new Date(Date.now());
                                var aktStunde = jetzt.getHours();
                                var unixTimestamp=new Date().getTime();
                                
                                // bis zu 18 Stunden in die Zukunft
                                const offsets=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18];
                                
                                for (let offset of offsets)
                                {
                                    // Template Objekt für BarChart erzeugen
                                    let itemData ={label:"", value:0.0, dataColor: "#c2c2c2", valueColor: "#dddddd"}; //, valueAppendix: "", valueColor: #ffffff"
                                
                                    // Vorbereitung um Werte aus Tibber Adapter zu holen         
                                    var prefix="";
                                    aktStunde=jetzt.getHours()+offset;
                                    if (aktStunde>23)
                                    {
                                        aktStunde=aktStunde-24;
                                        prefix=tibberPricesTomorrow;
                                    }
                                    else
                                    {
                                        prefix=tibberPricesToday;
                                    }
                                
                                    var strStunde = ("0" + aktStunde.toString()).slice(-2);
                                    itemData['label']=strStunde;
                                
                                    prefix=prefix+strStunde+'.';
                                
                                    var aktPrice=getState(prefix+tibberTotal).val;
                                
                                    // falls keine Daten vorliegen, weiter ohne diese ItemData an das Chart-Objekt anzuhängen
                                    if (aktPrice==null && aktStunde>=0)
                                        continue;
                                
                                    // von 0.2345 € auf Cent mit einer Nachkomma-Stelle umrechnen
                                    itemData['value']=Math.round(aktPrice*1000)/10.0;
                                
                                    // Je nach Preis den Balken einfärben
                                    if (aktPrice<0.30)
                                        itemData['dataColor']="green";
                                    else
                                    if (aktPrice<0.40)
                                        itemData['dataColor']="yellow";
                                    else
                                    if (aktPrice<0.50)
                                        itemData['dataColor']="orange";
                                    else
                                    if (aktPrice<0.60)
                                        itemData['dataColor']="red";
                                    else
                                        itemData['dataColor']="magenta";
                                
                                    // Daten für diese Stunde dem Objekt zufügen
                                    barChart.push(itemData);
                                }
                                
                                // fertiges Objekt in den Datenpunkt als JSON schreiben
                                setState("javascript."+instance+"."+idBarChartData, JSON.stringify(barChart), true);
                                

                                };

                                function createChartData () {
                                if(logOn) console.log(myName + " Stundenwechsel");

                                let chart = {};
                                let axisLabels =[];
                                let values =[];
                                let datalabels =[];
                                
                                var jetzt = new Date(Date.now());
                                var aktStunde = jetzt.getHours();
                                var unixTimestamp=new Date().getTime();
                                
                                const offsets=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18];
                                
                                // Spaltenbeschriftungen
                                
                                //chart.graphs[0].axisLables=axisLabels;
                                chart.graphs=new Array();
                                chart.graphs.push({});
                                chart.graphs[0].color="green";
                                chart.graphs[0].type="bar";
                                chart.graphs[0].datalabel_rotation=-90;
                                chart.graphs[0].datalabel_color="lightgreen";
                                chart.graphs[0].datalabel_fontSize=10;
                                chart.graphs[0].yAxis_title_text="cent";
                                chart.graphs[0].yAxis_show=true;
                                chart.graphs[0].legendText="Uhrzeit";
                                chart.graphs[0].datalabel_show=true;
                                chart.graphs[0].yAxis_minimumDigits=1;
                                chart.graphs[0].yAxis_maximumDigits=1;
                                
                                for (let offset of offsets)
                                {
                                    // Spaltenbeschriftungen
                                    aktStunde=jetzt.getHours()+offset;
                                    if (aktStunde>23)
                                        aktStunde=aktStunde-24;
                                    var strStunde = ("0" + aktStunde.toString()).slice(-2);
                                    axisLabels.push(strStunde)
                                    //axisLabels.push(aktStunde);
                                           
                                    var prefix="";
                                    aktStunde=jetzt.getHours()+offset;
                                    if (aktStunde>23)
                                    {
                                        aktStunde=aktStunde-24;
                                        prefix=tibberPricesTomorrow+".";
                                    }
                                    else
                                    {
                                        prefix=tibberPricesToday+".";
                                    }
                                
                                    strStunde = ("0" + aktStunde.toString()).slice(-2);
                                    prefix=prefix+strStunde+'.';
                                
                                    //if(logOn) console.log(myName + " Stundenwechsel, akt Stunde "+strStunde+", prefix "+prefix);
                                    var aktPrice=getState(prefix+tibberTotal).val;
                                    //var aktStartAt=getState(prefix+tibberStartsAt).val;
                                    //if(logOn) console.log(myName + " aktPrice "+aktPrice+", aktStartAt "+aktStartAt);
                                    //let itemData ={t:0, y:0.0};
                                    //itemData['t']=unixTimestamp+3600*offset;
                                    //itemData['y']=aktPrice;
                                    values.push(Math.round(aktPrice*1000)/10.0);
                                    var cents=(Math.round(aktPrice*1000)/10.0).toString();
                                    datalabels.push(cents);
                                
                                }
                                chart.graphs[0].data=values;
                                chart.graphs[0].datalabel_override=datalabels;
                                chart.data=values;
                                chart.datalabel_override=datalabels;
                                chart.axisLables=axisLabels;
                                
                                setState("javascript."+instance+"."+idChartData, JSON.stringify(chart));
                                

                                };

                                View


                                {
                                "settings": {
                                "style": {
                                "background-color": "",
                                "background-image": "",
                                "background-repeat": "",
                                "background-attachment": "",
                                "background-position": "",
                                "background-size": "",
                                "background-clip": "",
                                "background-origin": "",
                                "background_class": ""
                                },
                                "theme": "redmond",
                                "sizex": "1280",
                                "sizey": "800",
                                "gridSize": "10",
                                "snapType": 2,
                                "class": "no-invert",
                                "useBackground": false,
                                "useAsDefault": false,
                                "alwaysRender": false
                                },
                                "widgets": {
                                "e00001": {
                                "tpl": "tplHtml",
                                "data": {
                                "g_fixed": true,
                                "g_visibility": false,
                                "g_css_font_text": false,
                                "g_css_background": false,
                                "g_css_shadow_padding": false,
                                "g_css_border": false,
                                "g_gestures": false,
                                "g_signals": false,
                                "g_last_change": false,
                                "visibility-cond": "==",
                                "visibility-val": "",
                                "visibility-groups-action": "hide",
                                "refreshInterval": "0",
                                "signals-cond-0": "==",
                                "signals-val-0": true,
                                "signals-icon-0": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-0": 0,
                                "signals-blink-0": false,
                                "signals-horz-0": 0,
                                "signals-vert-0": 0,
                                "signals-hide-edit-0": false,
                                "signals-cond-1": "==",
                                "signals-val-1": true,
                                "signals-icon-1": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-1": 0,
                                "signals-blink-1": false,
                                "signals-horz-1": 0,
                                "signals-vert-1": 0,
                                "signals-hide-edit-1": false,
                                "signals-cond-2": "==",
                                "signals-val-2": true,
                                "signals-icon-2": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-2": 0,
                                "signals-blink-2": false,
                                "signals-horz-2": 0,
                                "signals-vert-2": 0,
                                "signals-hide-edit-2": false,
                                "lc-type": "last-change",
                                "lc-is-interval": true,
                                "lc-is-moment": false,
                                "lc-format": "",
                                "lc-position-vert": "top",
                                "lc-position-horz": "right",
                                "lc-offset-vert": 0,
                                "lc-offset-horz": 0,
                                "lc-font-size": "12px",
                                "lc-font-family": "",
                                "lc-font-style": "",
                                "lc-bkg-color": "",
                                "lc-color": "",
                                "lc-border-width": "0",
                                "lc-border-style": "",
                                "lc-border-color": "",
                                "lc-border-radius": 10,
                                "lc-zindex": 0,
                                "class": "no-invert",
                                "locked": false,
                                "html": ""
                                },
                                "style": {
                                "left": "0px",
                                "top": "169px",
                                "width": "1264px",
                                "height": "619px",
                                "z-index": 0,
                                "font-family": "Jura-DemiBold"
                                },
                                "widgetSet": "basic"
                                },
                                "e00002": {
                                "tpl": "tplContainerView",
                                "data": {
                                "g_fixed": true,
                                "g_visibility": false,
                                "g_css_font_text": false,
                                "g_css_background": false,
                                "g_css_shadow_padding": false,
                                "g_css_border": false,
                                "g_gestures": false,
                                "g_signals": false,
                                "g_last_change": false,
                                "visibility-cond": "==",
                                "visibility-val": 1,
                                "visibility-groups-action": "hide",
                                "signals-cond-0": "==",
                                "signals-val-0": true,
                                "signals-icon-0": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-0": 0,
                                "signals-blink-0": false,
                                "signals-horz-0": 0,
                                "signals-vert-0": 0,
                                "signals-hide-edit-0": false,
                                "signals-cond-1": "==",
                                "signals-val-1": true,
                                "signals-icon-1": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-1": 0,
                                "signals-blink-1": false,
                                "signals-horz-1": 0,
                                "signals-vert-1": 0,
                                "signals-hide-edit-1": false,
                                "signals-cond-2": "==",
                                "signals-val-2": true,
                                "signals-icon-2": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-2": 0,
                                "signals-blink-2": false,
                                "signals-horz-2": 0,
                                "signals-vert-2": 0,
                                "signals-hide-edit-2": false,
                                "lc-type": "last-change",
                                "lc-is-interval": true,
                                "lc-is-moment": false,
                                "lc-format": "",
                                "lc-position-vert": "top",
                                "lc-position-horz": "right",
                                "lc-offset-vert": 0,
                                "lc-offset-horz": 0,
                                "lc-font-size": "12px",
                                "lc-font-family": "",
                                "lc-font-style": "",
                                "lc-bkg-color": "",
                                "lc-color": "",
                                "lc-border-width": "0",
                                "lc-border-style": "",
                                "lc-border-color": "",
                                "lc-border-radius": 10,
                                "lc-zindex": 0,
                                "contains_view": "A_Menu",
                                "name": "VIEW_Header-Menü",
                                "locked": false
                                },
                                "style": {
                                "left": "0px",
                                "top": "0px",
                                "width": "1280px",
                                "height": "180px",
                                "font-family": "Jura-DemiBold"
                                },
                                "widgetSet": "basic"
                                },
                                "e00003": {
                                "tpl": "tplHtmlNav",
                                "data": {
                                "g_fixed": true,
                                "g_visibility": false,
                                "g_css_font_text": false,
                                "g_css_background": false,
                                "g_css_shadow_padding": false,
                                "g_css_border": false,
                                "g_gestures": false,
                                "g_signals": false,
                                "g_last_change": false,
                                "visibility-cond": "==",
                                "visibility-val": 1,
                                "visibility-groups-action": "hide",
                                "signals-cond-0": "==",
                                "signals-val-0": true,
                                "signals-icon-0": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-0": 0,
                                "signals-blink-0": false,
                                "signals-horz-0": 0,
                                "signals-vert-0": 0,
                                "signals-hide-edit-0": false,
                                "signals-cond-1": "==",
                                "signals-val-1": true,
                                "signals-icon-1": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-1": 0,
                                "signals-blink-1": false,
                                "signals-horz-1": 0,
                                "signals-vert-1": 0,
                                "signals-hide-edit-1": false,
                                "signals-cond-2": "==",
                                "signals-val-2": true,
                                "signals-icon-2": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-2": 0,
                                "signals-blink-2": false,
                                "signals-horz-2": 0,
                                "signals-vert-2": 0,
                                "signals-hide-edit-2": false,
                                "lc-type": "last-change",
                                "lc-is-interval": true,
                                "lc-is-moment": false,
                                "lc-format": "",
                                "lc-position-vert": "top",
                                "lc-position-horz": "right",
                                "lc-offset-vert": 0,
                                "lc-offset-horz": 0,
                                "lc-font-size": "12px",
                                "lc-font-family": "",
                                "lc-font-style": "",
                                "lc-bkg-color": "",
                                "lc-color": "",
                                "lc-border-width": "0",
                                "lc-border-style": "",
                                "lc-border-color": "",
                                "lc-border-radius": 10,
                                "lc-zindex": 0,
                                "html": "Tibber",
                                "class": "menu-item",
                                "nav_view": "Tibber",
                                "hide_effect": "show",
                                "show_effect": "show",
                                "sync": true,
                                "body-background": "#ffffff"
                                },
                                "style": {
                                "left": "378px",
                                "top": "50px",
                                "opacity": "",
                                "z-index": "99",
                                "width": "auto",
                                "font-family": "Jura-DemiBold"
                                },
                                "widgetSet": "basic"
                                },
                                "e00004": {
                                "tpl": "tplVis-materialdesign-Chart-Bar",
                                "data": {
                                "oid": "javascript.0.tibber.prices.barChartData",
                                "g_fixed": true,
                                "g_visibility": false,
                                "g_css_font_text": true,
                                "g_css_background": false,
                                "g_css_shadow_padding": false,
                                "g_css_border": false,
                                "g_gestures": false,
                                "g_signals": false,
                                "g_last_change": false,
                                "visibility-cond": "==",
                                "visibility-val": 1,
                                "visibility-groups-action": "hide",
                                "chartDataMethod": "jsonStringObject",
                                "dataCount": "0",
                                "chartType": "vertical",
                                "backgroundColor": "#mdwTheme:vis-materialdesign.0.colors.charts.background",
                                "chartAreaBackgroundColor": "#mdwTheme:vis-materialdesign.0.colors.charts.background_chart",
                                "titleLayout": "#mdwTheme:vis-materialdesign.0.fontSizes.card.title",
                                "titleFontFamily": "Jura-DemiBold",
                                "colorBackground": "#mdwTheme:vis-materialdesign.0.colors.card.background",
                                "colorTitleSectionBackground": "#mdwTheme:vis-materialdesign.0.colors.card.background_title",
                                "colorTextSectionBackground": "#mdwTheme:vis-materialdesign.0.colors.card.background_body",
                                "colorTitle": "#mdwTheme:vis-materialdesign.0.colors.card.title",
                                "globalColor": "#mdwTheme:vis-materialdesign.0.colors.charts.global",
                                "hoverColor": "#mdwTheme:vis-materialdesign.0.colors.charts.bar.hover",
                                "hoverBorderColor": "#mdwTheme:vis-materialdesign.0.colors.charts.bar.hover_border",
                                "showValues": "showValuesOn",
                                "valuesFontColor": "#mdwTheme:vis-materialdesign.0.colors.charts.value",
                                "valuesFontFamily": "Jura-Medium",
                                "valuesFontSize": "17",
                                "valuesPositionAnchor": "end",
                                "valuesPositionAlign": "center",
                                "valuesTextAlign": "center",
                                "yAxisPosition": "left",
                                "yAxisTitleColor": "#mdwTheme:vis-materialdesign.0.colors.charts.y_axis_title",
                                "yAxisTitleFontFamily": "Jura-DemiBold",
                                "yAxisTitleFontSize": "0",
                                "yAxisValueLabelColor": "#dddddd",
                                "yAxisValueFontFamily": "#mdwTheme:vis-materialdesign.0.fonts.charts.y_axis_values",
                                "yAxisValueFontSize": "#mdwTheme:vis-materialdesign.0.fontSizes.charts.y_axis_values",
                                "yAxisValueDistanceToAxis": "10",
                                "yAxisShowAxis": "true",
                                "yAxisShowAxisLabels": "true",
                                "yAxisShowGridLines": "true",
                                "yAxisGridLinesColor": "#ffffff",
                                "yAxisShowTicks": "true",
                                "yAxisZeroLineColor": "#mdwTheme:vis-materialdesign.0.colors.charts.y_axis_zeroline",
                                "xAxisPosition": "bottom",
                                "xAxisTicksSource": "auto",
                                "xAxisTitleColor": "#mdwTheme:vis-materialdesign.0.colors.charts.value",
                                "xAxisTitleFontFamily": "Jura-DemiBold",
                                "xAxisTitleFontSize": "2",
                                "xAxisValueLabelColor": "#dddddd",
                                "xAxisValueFontFamily": "#mdwTheme:vis-materialdesign.0.fonts.charts.x_axis_values",
                                "xAxisValueFontSize": "#mdwTheme:vis-materialdesign.0.fontSizes.charts.x_axis_values",
                                "xAxisValueDistanceToAxis": "0",
                                "xAxisShowAxis": "true",
                                "xAxisShowAxisLabels": "true",
                                "xAxisShowGridLines": "true",
                                "xAxisGridLinesColor": "#ffffff",
                                "xAxisShowTicks": "true",
                                "xAxisZeroLineColor": "#mdwTheme:vis-materialdesign.0.colors.charts.x_axis_zeroline",
                                "xAxisMinRotation": "0",
                                "xAxisMaxRotation": "0",
                                "legendPosition": "right",
                                "legendFontColor": "#mdwTheme:vis-materialdesign.0.colors.charts.legend",
                                "legendFontFamily": "#mdwTheme:vis-materialdesign.0.fonts.charts.legend",
                                "legendFontSize": "#mdwTheme:vis-materialdesign.0.fontSizes.charts.legend",
                                "legendPointStyle": "true",
                                "showTooltip": "true",
                                "tooltipBackgroundColor": "#mdwTheme:vis-materialdesign.0.colors.charts.tooltip_background",
                                "tooltipShowColorBox": "true",
                                "tooltipTitleFontColor": "#mdwTheme:vis-materialdesign.0.colors.charts.tooltip_title",
                                "tooltipTitleFontFamily": "#mdwTheme:vis-materialdesign.0.fonts.charts.tooltip_title",
                                "tooltipTitleFontSize": "#mdwTheme:vis-materialdesign.0.fontSizes.charts.tooltip_title",
                                "tooltipBodyFontColor": "#mdwTheme:vis-materialdesign.0.colors.charts.tooltip_text",
                                "tooltipBodyFontFamily": "#mdwTheme:vis-materialdesign.0.fonts.charts.tooltip_text",
                                "tooltipBodyFontSize": "#mdwTheme:vis-materialdesign.0.fontSizes.charts.tooltip_text",
                                "signals-cond-0": "==",
                                "signals-val-0": true,
                                "signals-icon-0": "/vis/signals/lowbattery.png",
                                "signals-icon-size-0": 0,
                                "signals-blink-0": false,
                                "signals-horz-0": 0,
                                "signals-vert-0": 0,
                                "signals-hide-edit-0": false,
                                "signals-cond-1": "==",
                                "signals-val-1": true,
                                "signals-icon-1": "/vis/signals/lowbattery.png",
                                "signals-icon-size-1": 0,
                                "signals-blink-1": false,
                                "signals-horz-1": 0,
                                "signals-vert-1": 0,
                                "signals-hide-edit-1": false,
                                "signals-cond-2": "==",
                                "signals-val-2": true,
                                "signals-icon-2": "/vis/signals/lowbattery.png",
                                "signals-icon-size-2": 0,
                                "signals-blink-2": false,
                                "signals-horz-2": 0,
                                "signals-vert-2": 0,
                                "signals-hide-edit-2": false,
                                "lc-type": "last-change",
                                "lc-is-interval": true,
                                "lc-is-moment": false,
                                "lc-format": "",
                                "lc-position-vert": "top",
                                "lc-position-horz": "right",
                                "lc-offset-vert": 0,
                                "lc-offset-horz": 0,
                                "lc-font-size": "12px",
                                "lc-font-family": "",
                                "lc-font-style": "",
                                "lc-bkg-color": "",
                                "lc-color": "",
                                "lc-border-width": "0",
                                "lc-border-style": "",
                                "lc-border-color": "",
                                "lc-border-radius": 10,
                                "lc-zindex": 0,
                                "chartPaddingBottom": "1",
                                "cardUse": false,
                                "xAxisTitle": "",
                                "showLegend": false,
                                "axisValueAppendText": "",
                                "axisLabelAutoSkip": false,
                                "g_layoutForData_§0": false,
                                "g_oids": false,
                                "barWidth": "55",
                                "valuesRotation": "0",
                                "valuesPositionOffset": "",
                                "valuesMaxDecimals": "1",
                                "valuesMinDecimals": "1",
                                "class": "no-invert",
                                "chartPaddingTop": "0",
                                "valuesSteps": "1",
                                "colorScheme": ""
                                },
                                "style": {
                                "left": "40px",
                                "top": "210px",
                                "width": "1000px",
                                "height": "580px",
                                "z-index": "100",
                                "font-family": "Jura-DemiBold"
                                },
                                "widgetSet": "materialdesign"
                                },
                                "e00005": {
                                "tpl": "tplHtml",
                                "data": {
                                "g_fixed": true,
                                "g_visibility": false,
                                "g_css_font_text": false,
                                "g_css_background": true,
                                "g_css_shadow_padding": false,
                                "g_css_border": true,
                                "g_gestures": false,
                                "g_signals": false,
                                "g_last_change": false,
                                "visibility-cond": "==",
                                "visibility-val": 1,
                                "visibility-groups-action": "hide",
                                "refreshInterval": "0",
                                "signals-cond-0": "==",
                                "signals-val-0": true,
                                "signals-icon-0": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-0": 0,
                                "signals-blink-0": false,
                                "signals-horz-0": 0,
                                "signals-vert-0": 0,
                                "signals-hide-edit-0": false,
                                "signals-cond-1": "==",
                                "signals-val-1": true,
                                "signals-icon-1": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-1": 0,
                                "signals-blink-1": false,
                                "signals-horz-1": 0,
                                "signals-vert-1": 0,
                                "signals-hide-edit-1": false,
                                "signals-cond-2": "==",
                                "signals-val-2": true,
                                "signals-icon-2": "/vis.0/main/lowbattery.png",
                                "signals-icon-size-2": 0,
                                "signals-blink-2": false,
                                "signals-horz-2": 0,
                                "signals-vert-2": 0,
                                "signals-hide-edit-2": false,
                                "lc-type": "last-change",
                                "lc-is-interval": true,
                                "lc-is-moment": false,
                                "lc-format": "",
                                "lc-position-vert": "top",
                                "lc-position-horz": "right",
                                "lc-offset-vert": 0,
                                "lc-offset-horz": 0,
                                "lc-font-size": "12px",
                                "lc-font-family": "",
                                "lc-font-style": "",
                                "lc-bkg-color": "",
                                "lc-color": "",
                                "lc-border-width": "0",
                                "lc-border-style": "",
                                "lc-border-color": "",
                                "lc-border-radius": 10,
                                "lc-zindex": 0,
                                "class": "no-invert"
                                },
                                "style": {
                                "left": "6px",
                                "top": "197px",
                                "width": "1262px",
                                "height": "582px",
                                "z-index": "0",
                                "background-color": "#000000",
                                "border-radius": "10px",
                                "font-family": "Jura-DemiBold"
                                },
                                "widgetSet": "basic"
                                }
                                },
                                "name": "Tibber",
                                "filterList": []
                                }

                                und diesen Chart (der wurde schon auf den neuen Tibberconnect Adapter umgeschrieben, sieht aber nicht so schön aus
                                de171329-b9f8-48e2-be79-8d1df7762192-image.png

                                /****************************************************************************************************
                                Script, um mittels Google Charts einen Wetter-Graph anzuzeigen
                                Aktuelle Version: https://github.com/Mic-M/iobroker.google-charts-example/
                                Support: https://forum.iobroker.net/topic/22779/vorlage-google-charts-beispiel
                                Autor: Mic (ioBroker-Forum) / Mic-M (Github)
                                changes for tibber: theGrinch (ioBroker-Forum), Tibber invite: https://invite.tibber.com/3ixvd5z5
                                Change Log:
                                0.3.2 changed for tibberconnect adapter
                                0.3.1 show energy prices from tibber
                                0.3 Mic * Added line color - https://forum.iobroker.net/post/389919
                                0.2 Mic + Fix/improve file creation.
                                0.1 Mic - Initial Release
                                /
                                /
                                *

                                Konfiguration
                                ******************************************************************************/
                                // Der Pfad der HTML-Datei, einfach entsprechend anpassen.
                                // Die Datei wird abgelegt unterhalb von '/opt/iobroker/iobroker-data/files/vis.0/'
                                const FILE_PATH = 'main/googleChartTibber2.html';

                                // Schedule
                                const M_SCHEDULE = '2 * * * *'; // Jede Stunde +2 Minuten

                                // Ausgaben für Debug
                                const LOG_DEBUG = true;

                                /*******************************************************************************

                                Global constants/variables
                                /
                                let mSchedule; // for the schedule
                                /

                                Executed on every script start.
                                *******************************************************************************/
                                main();
                                function main() {

                                // Write the file initially on script start
                                writeGoogleHtml(function(success) {
                                if (LOG_DEBUG) log('[Debug] We are now in the callback of writeWeatherHtml().');
                                if (success) {
                                if (LOG_DEBUG) log('[Debug] Successfully executed writeWeatherHtml(), so we schedule the updates.');
                                clearSchedule(mSchedule);
                                mSchedule = schedule(M_SCHEDULE, writeGoogleHtml);
                                } else {
                                log('File not successfully created/updated, so we stop at this point.', 'error');
                                }
                                });

                                }

                                /**

                                Writing Google html file.
                                @param {object} [callback] Optional: A callback function which is executed after proceeding this function.
                                */
                                function writeGoogleHtml(callback = undefined) {
                                let result = writeFile('vis.0', FILE_PATH, buildHTML(), function (error) {
                                if (error) {
                                log('[Error] Error while executing writeFile(): ' + error);
                                if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                if (LOG_DEBUG) log('[Debug] Function to callback parameter was provided');
                                return callback(false);
                                } else {
                                return;
                                }
                                } else {
                                if (LOG_DEBUG) log('[Debug] File successfully written: [' + FILE_PATH + ']');
                                if (typeof callback === 'function') { // execute if a function was provided to parameter callback
                                if (LOG_DEBUG) log('[Debug] Function to callback parameter was provided');
                                return callback(true);
                                } else {
                                return;
                                }
                                }
                                })
                                return result;
                                }
                                function buildHTML() {
                                let html = '';
                                html += '<html>\n';
                                html += '<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>\n';
                                html += '<script type="text/javascript">\n';
                                html += "google.charts.load('current', {'packages':['corechart']});\n";
                                html += "google.charts.setOnLoadCallback(drawChart);\n";
                                html += "function drawChart() {"; + "\n";

                                html += "var data = new google.visualization.DataTable();\n";
                                html += "data.addColumn('number', 'hour');\n";
                                html += "data.addColumn('number', 'today');\n";
                                html += "data.addColumn({type: 'number', role: 'annotation'});\n";
                                html += "data.addColumn('number', 'tomorrow');\n";
                                html += "data.addColumn({type: 'number', role: 'annotation'});\n";
                                for (let i = 0; i <= 9; i++) {
                                let tLow = getState('tibberconnect.0.Homes.63e548f3-8b32-4eed-9c9b-9eacb9f9558e.PricesToday.' + i + '.total').val;
                                let tHigh = getState('tibberconnect.0.Homes.63e548f3-8b32-4eed-9c9b-9eacb9f9558e.PricesTomorrow.' + i + '.total').val;
                                html += " data.addRow([" + i + ", " + tLow + ", " + tLow + ", " + tHigh + ", " + tHigh + "]);\n";
                                }
                                for (let i = 10; i <= 23; i++) {
                                let tLow = getState('tibberconnect.0.Homes.63e548f3-8b32-4eed-9c9b-9eacb9f9558e.PricesToday.' + i + '.total').val;
                                let tHigh = getState('tibberconnect.0.Homes.63e548f3-8b32-4eed-9c9b-9eacb9f9558e.PricesTomorrow.' + i + '.total').val;
                                html += " data.addRow([" + i + ", " + tLow + ", " + tLow + ", " + tHigh + ", " + tHigh + "]);\n";
                                }

                                // See: https://developers.google.com/chart/interactive/docs/gallery/linechart#configuration-options
                                html += "var options = {\n";
                                // Line colors (HTML): lower upper
                                html += " colors: ['CornflowerBlue', 'DarkTurquoise'],\n";
                                html += " curveType: 'function', backgroundColor: 'transparent', pointSize: 4,\n";
                                html += " hAxis: { textStyle:{color:'black'}},\n";
                                html += " vAxis: { textPosition: 'none', textStyle:{color:'red'},\n";
                                html += " baselineColor:'transparent', gridlines:{count:0} }, legend: { position: 'bottom' },\n";
                                html += " annotations: { stem: { length: 5, color: 'transparent' }, textStyle: {fontSize: 10, alwaysOutside: true, bold: false} }\n";
                                html += "};\n";
                                html += "var chart = new google.visualization.LineChart(document.getElementById('mychart'));\n";
                                html += "chart.draw(data, options);\n";
                                html += "}\n";
                                html += "</script>\n";
                                html += '<div id="mychart" style="width: 700px; height: 400px;"></div>\n';
                                html += '</html>\n';
                                return html;
                                }

                                T Offline
                                T Offline
                                theGrinch
                                schrieb am zuletzt editiert von
                                #55

                                @mikerow sagte in Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben:

                                und diesen Chart (der wurde schon auf den neuen Tibberconnect Adapter umgeschrieben, sieht aber nicht so schön aus

                                Ey, ich kann hier auch lesen 😉

                                Kannst du die Formatierung von dem BarChart-Skript in deinem Post mal fixen oder mit den Link zum Originalskript schicken? Das sollte relativ gut anpassbar sein an Werte aus dem neuen Adapter und/oder hier.
                                Nur mit der kaputten Formatierung komm ich nicht klar.

                                M 1 Antwort Letzte Antwort
                                0
                                • T theGrinch

                                  @mikerow sagte in Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben:

                                  und diesen Chart (der wurde schon auf den neuen Tibberconnect Adapter umgeschrieben, sieht aber nicht so schön aus

                                  Ey, ich kann hier auch lesen 😉

                                  Kannst du die Formatierung von dem BarChart-Skript in deinem Post mal fixen oder mit den Link zum Originalskript schicken? Das sollte relativ gut anpassbar sein an Werte aus dem neuen Adapter und/oder hier.
                                  Nur mit der kaputten Formatierung komm ich nicht klar.

                                  M Offline
                                  M Offline
                                  MikeRow
                                  schrieb am zuletzt editiert von
                                  #56

                                  @thegrinch

                                  Hi, Original Post hier https://forum.iobroker.net/topic/47195/diagramm-mit-festen-werten-in-vis-nur-wie/13?lang=en-GB von Familienvater.

                                  var myName = "tibber.createchartdata";
                                   
                                  var logOn           = false;     // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden immer ausgegeben.
                                  var forceCreation    = false;    // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden)
                                   
                                  var tibberPricesToday = "tibber.0.priceInfo.today.";        // mit . am Ende!
                                  var tibberPricesTomorrow = "tibber.0.priceInfo.tomorrow.";  // mit . am Ende!
                                   
                                  var tibberStartsAt = "startsAt";
                                  var tibberTotal = "total";
                                   
                                   
                                  // Datenpunkte anlegen:
                                  // -----------------------------------------------------------------------------
                                  var idChartData = "tibber.prices.chartData";                      // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
                                  createState(idChartData, '[{"label":"15","value":"25.2","dataColor":"#ffffff"},{"label":"16","value":"28.8","dataColor":"#ffffff"},{"label":"17","value":3"5.2","dataColor":"#ffffff"},{"label":"18","value":"33.2","dataColor":"#ffffff"},{"label":"19","value":"20.2","dataColor":"#ffffff"}]', forceCreation, {
                                       name: 'Chart-Data Price Forecast',
                                       desc: 'Chart-Data Price Forecast',
                                       type: 'string',
                                       role: 'value'
                                  });
                                   
                                  // Datenpunkte anlegen:
                                  // -----------------------------------------------------------------------------
                                  var idBarChartData = "tibber.prices.barChartData";                      // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
                                  createState(idBarChartData, '[{"label":"15","value":"25.2","dataColor":"#ffffff"},{"label":"16","value":"28.8","dataColor":"#ffffff"},{"label":"17","value":3"5.2","dataColor":"#ffffff"},{"label":"18","value":"33.2","dataColor":"#ffffff"},{"label":"19","value":"20.2","dataColor":"#ffffff"}]', forceCreation, {
                                       name: 'Bar Chart-Data Price Forecast',
                                       desc: 'Bar Chart-Data Price Forecast',
                                       type: 'string',
                                       role: 'value'
                                  });
                                   
                                  createBarChartData();
                                   
                                  // Cron-Job, zum Stundenwechsel
                                  // Stundenwechsel, Ausführen immer um *:00:10
                                  schedule('10 0 * * * *', function () {createBarChartData()});
                                   
                                  function createBarChartData () {    
                                  	if(logOn) console.log(myName + " Stundenwechsel");
                                      
                                      let barChart = [];
                                   
                                      var jetzt = new Date(Date.now());
                                      var aktStunde = jetzt.getHours();
                                      var unixTimestamp=new Date().getTime();
                                   
                                      // bis zu 18 Stunden in die Zukunft
                                      const offsets=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18];
                                   
                                      for (let offset of offsets)
                                      {
                                          // Template Objekt für BarChart erzeugen
                                          let itemData ={label:"", value:0.0, dataColor: "#c2c2c2", valueColor: "#dddddd"}; //, valueAppendix: "", valueColor: #ffffff"
                                   
                                          // Vorbereitung um Werte aus Tibber Adapter zu holen         
                                          var prefix="";
                                          aktStunde=jetzt.getHours()+offset;
                                          if (aktStunde>23)
                                          {
                                              aktStunde=aktStunde-24;
                                              prefix=tibberPricesTomorrow;
                                          }
                                          else
                                          {
                                              prefix=tibberPricesToday;
                                          }
                                   
                                          var strStunde = ("0" + aktStunde.toString()).slice(-2);
                                          itemData['label']=strStunde;
                                   
                                          prefix=prefix+strStunde+'.';
                                   
                                          var aktPrice=getState(prefix+tibberTotal).val;
                                   
                                          // falls keine Daten vorliegen, weiter ohne diese ItemData an das Chart-Objekt anzuhängen
                                          if (aktPrice==null && aktStunde>=0)
                                              continue;
                                   
                                          // von 0.2345 € auf Cent mit einer Nachkomma-Stelle umrechnen
                                          itemData['value']=Math.round(aktPrice*1000)/10.0;
                                   
                                          // Je nach Preis den Balken einfärben
                                          if (aktPrice<0.30)
                                              itemData['dataColor']="green";
                                          else
                                          if (aktPrice<0.40)
                                              itemData['dataColor']="yellow";
                                          else
                                          if (aktPrice<0.50)
                                              itemData['dataColor']="orange";
                                          else
                                          if (aktPrice<0.60)
                                              itemData['dataColor']="red";
                                          else
                                              itemData['dataColor']="magenta";
                                   
                                          // Daten für diese Stunde dem Objekt zufügen
                                          barChart.push(itemData);
                                      }
                                   
                                      // fertiges Objekt in den Datenpunkt als JSON schreiben
                                      setState("javascript."+instance+"."+idBarChartData, JSON.stringify(barChart), true);
                                   
                                  };
                                   
                                  function createChartData () {    
                                  	if(logOn) console.log(myName + " Stundenwechsel");
                                      
                                      let chart = {};
                                      let axisLabels =[];
                                      let values =[];
                                      let datalabels =[];
                                   
                                      var jetzt = new Date(Date.now());
                                      var aktStunde = jetzt.getHours();
                                      var unixTimestamp=new Date().getTime();
                                   
                                      const offsets=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18];
                                   
                                      // Spaltenbeschriftungen
                                   
                                      //chart.graphs[0].axisLables=axisLabels;
                                      chart.graphs=new Array();
                                      chart.graphs.push({});
                                      chart.graphs[0].color="green";
                                      chart.graphs[0].type="bar";
                                      chart.graphs[0].datalabel_rotation=-90;
                                      chart.graphs[0].datalabel_color="lightgreen";
                                      chart.graphs[0].datalabel_fontSize=10;
                                      chart.graphs[0].yAxis_title_text="cent";
                                      chart.graphs[0].yAxis_show=true;
                                      chart.graphs[0].legendText="Uhrzeit";
                                      chart.graphs[0].datalabel_show=true;
                                      chart.graphs[0].yAxis_minimumDigits=1;
                                      chart.graphs[0].yAxis_maximumDigits=1;
                                   
                                      for (let offset of offsets)
                                      {
                                          // Spaltenbeschriftungen
                                          aktStunde=jetzt.getHours()+offset;
                                          if (aktStunde>23)
                                              aktStunde=aktStunde-24;
                                          var strStunde = ("0" + aktStunde.toString()).slice(-2);
                                          axisLabels.push(strStunde)
                                          //axisLabels.push(aktStunde);
                                                 
                                          var prefix="";
                                          aktStunde=jetzt.getHours()+offset;
                                          if (aktStunde>23)
                                          {
                                              aktStunde=aktStunde-24;
                                              prefix=tibberPricesTomorrow+".";
                                          }
                                          else
                                          {
                                              prefix=tibberPricesToday+".";
                                          }
                                   
                                          strStunde = ("0" + aktStunde.toString()).slice(-2);
                                          prefix=prefix+strStunde+'.';
                                   
                                          //if(logOn) console.log(myName + " Stundenwechsel, akt Stunde "+strStunde+", prefix "+prefix);
                                          var aktPrice=getState(prefix+tibberTotal).val;
                                          //var aktStartAt=getState(prefix+tibberStartsAt).val;
                                          //if(logOn) console.log(myName + " aktPrice "+aktPrice+", aktStartAt "+aktStartAt);
                                          //let itemData ={t:0, y:0.0};
                                          //itemData['t']=unixTimestamp+3600*offset;
                                          //itemData['y']=aktPrice;
                                          values.push(Math.round(aktPrice*1000)/10.0);
                                          var cents=(Math.round(aktPrice*1000)/10.0).toString();
                                          datalabels.push(cents);
                                   
                                      }
                                      chart.graphs[0].data=values;
                                      chart.graphs[0].datalabel_override=datalabels;
                                      chart.data=values;
                                      chart.datalabel_override=datalabels;
                                      chart.axisLables=axisLabels;
                                   
                                      setState("javascript."+instance+"."+idChartData, JSON.stringify(chart));
                                   
                                  };
                                  
                                  
                                  1 Antwort Letzte Antwort
                                  0
                                  • T Offline
                                    T Offline
                                    theGrinch
                                    schrieb am zuletzt editiert von
                                    #57

                                    @mikerow tadaaaaa, angepasstes Skript.
                                    Du musst nur deine "home" reinkopieren in Zeile 6+7.

                                    Ich habe es jetzt für den tibberconnect angepasst, das war einfacher.

                                    var myName = "tibber.createchartdata";
                                     
                                    var logOn           = false;     // Skript Logausgabe ein- (true) / ausschalten (false). Fehler werden immer ausgegeben.
                                    var forceCreation    = false;    // Default: false. true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden)
                                     
                                    var tibberPricesToday = "tibberconnect.0.Homes.*****.PricesToday.";        // mit . am Ende!
                                    var tibberPricesTomorrow = "tibberconnect.0.Homes.*****.PricesTomorrow.";  // mit . am Ende!
                                     
                                    var tibberStartsAt = "startsAt";
                                    var tibberTotal = "total";
                                     
                                     
                                    // Datenpunkte anlegen:
                                    // -----------------------------------------------------------------------------
                                    var idChartData = "tibber.prices.chartData";                      // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
                                    createState(idChartData, '[{"label":"15","value":"25.2","dataColor":"#ffffff"},{"label":"16","value":"28.8","dataColor":"#ffffff"},{"label":"17","value":3"5.2","dataColor":"#ffffff"},{"label":"18","value":"33.2","dataColor":"#ffffff"},{"label":"19","value":"20.2","dataColor":"#ffffff"}]', forceCreation, {
                                         name: 'Chart-Data Price Forecast',
                                         desc: 'Chart-Data Price Forecast',
                                         type: 'string',
                                         role: 'value'
                                    });
                                     
                                    // Datenpunkte anlegen:
                                    // -----------------------------------------------------------------------------
                                    var idBarChartData = "tibber.prices.barChartData";                      // Pfad und Name, unter dem in der Javascript-Instanz der Datenpunkte angelegt wird
                                    createState(idBarChartData, '[{"label":"15","value":"25.2","dataColor":"#ffffff"},{"label":"16","value":"28.8","dataColor":"#ffffff"},{"label":"17","value":3"5.2","dataColor":"#ffffff"},{"label":"18","value":"33.2","dataColor":"#ffffff"},{"label":"19","value":"20.2","dataColor":"#ffffff"}]', forceCreation, {
                                         name: 'Bar Chart-Data Price Forecast',
                                         desc: 'Bar Chart-Data Price Forecast',
                                         type: 'string',
                                         role: 'value'
                                    });
                                     
                                    createBarChartData();
                                     
                                    // Cron-Job, zum Stundenwechsel
                                    // Stundenwechsel, Ausführen immer um *:00:10
                                    schedule('10 0 * * * *', function () {createBarChartData()});
                                     
                                    function createBarChartData () {    
                                    	if(logOn) console.log(myName + " Stundenwechsel");
                                        
                                        let barChart = [];
                                     
                                        var jetzt = new Date(Date.now());
                                        var aktStunde = jetzt.getHours();
                                        var unixTimestamp=new Date().getTime();
                                     
                                        // bis zu 18 Stunden in die Zukunft
                                        const offsets=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18];
                                     
                                        for (let offset of offsets)
                                        {
                                            // Template Objekt für BarChart erzeugen
                                            let itemData ={label:"", value:0.0, dataColor: "#c2c2c2", valueColor: "#dddddd"}; //, valueAppendix: "", valueColor: #ffffff"
                                     
                                            // Vorbereitung um Werte aus Tibber Adapter zu holen         
                                            var prefix="";
                                            aktStunde=jetzt.getHours()+offset;
                                            if (aktStunde>23)
                                            {
                                                aktStunde=aktStunde-24;
                                                prefix=tibberPricesTomorrow;
                                            }
                                            else
                                            {
                                                prefix=tibberPricesToday;
                                            }
                                     
                                            var strStunde = (aktStunde.toString()).slice(-2); //("0" + aktStunde.toString()).slice(-2);
                                            itemData['label']=strStunde;
                                     
                                            prefix=prefix+strStunde+'.';
                                     
                                            var aktPrice=getState(prefix+tibberTotal).val;
                                     
                                            // falls keine Daten vorliegen, weiter ohne diese ItemData an das Chart-Objekt anzuhängen
                                            if (aktPrice==null && aktStunde>=0)
                                                continue;
                                     
                                            // von 0.2345 € auf Cent mit einer Nachkomma-Stelle umrechnen
                                            itemData['value']=Math.round(aktPrice*1000)/10.0;
                                     
                                            // Je nach Preis den Balken einfärben
                                            if (aktPrice<0.30)
                                                itemData['dataColor']="green";
                                            else
                                            if (aktPrice<0.40)
                                                itemData['dataColor']="yellow";
                                            else
                                            if (aktPrice<0.50)
                                                itemData['dataColor']="orange";
                                            else
                                            if (aktPrice<0.60)
                                                itemData['dataColor']="red";
                                            else
                                                itemData['dataColor']="magenta";
                                     
                                            // Daten für diese Stunde dem Objekt zufügen
                                            barChart.push(itemData);
                                        }
                                     
                                        // fertiges Objekt in den Datenpunkt als JSON schreiben
                                        setState("javascript."+instance+"."+idBarChartData, JSON.stringify(barChart), true);
                                     
                                    };
                                     
                                    function createChartData () {    
                                    	if(logOn) console.log(myName + " Stundenwechsel");
                                        
                                        let chart = {};
                                        let axisLabels =[];
                                        let values =[];
                                        let datalabels =[];
                                     
                                        var jetzt = new Date(Date.now());
                                        var aktStunde = jetzt.getHours();
                                        var unixTimestamp=new Date().getTime();
                                     
                                        const offsets=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18];
                                     
                                        // Spaltenbeschriftungen
                                     
                                        //chart.graphs[0].axisLables=axisLabels;
                                        chart.graphs=new Array();
                                        chart.graphs.push({});
                                        chart.graphs[0].color="green";
                                        chart.graphs[0].type="bar";
                                        chart.graphs[0].datalabel_rotation=-90;
                                        chart.graphs[0].datalabel_color="lightgreen";
                                        chart.graphs[0].datalabel_fontSize=10;
                                        chart.graphs[0].yAxis_title_text="cent";
                                        chart.graphs[0].yAxis_show=true;
                                        chart.graphs[0].legendText="Uhrzeit";
                                        chart.graphs[0].datalabel_show=true;
                                        chart.graphs[0].yAxis_minimumDigits=1;
                                        chart.graphs[0].yAxis_maximumDigits=1;
                                     
                                        for (let offset of offsets)
                                        {
                                            // Spaltenbeschriftungen
                                            aktStunde=jetzt.getHours()+offset;
                                            if (aktStunde>23)
                                                aktStunde=aktStunde-24;
                                            var strStunde = (aktStunde.toString()).slice(-2); //("0" + aktStunde.toString()).slice(-2);
                                            axisLabels.push(strStunde)
                                            //axisLabels.push(aktStunde);
                                                   
                                            var prefix="";
                                            aktStunde=jetzt.getHours()+offset;
                                            if (aktStunde>23)
                                            {
                                                aktStunde=aktStunde-24;
                                                prefix=tibberPricesTomorrow+".";
                                            }
                                            else
                                            {
                                                prefix=tibberPricesToday+".";
                                            }
                                     
                                            strStunde = ("0" + aktStunde.toString()).slice(-2);
                                            prefix=prefix+strStunde+'.';
                                     
                                            //if(logOn) console.log(myName + " Stundenwechsel, akt Stunde "+strStunde+", prefix "+prefix);
                                            var aktPrice=getState(prefix+tibberTotal).val;
                                            //var aktStartAt=getState(prefix+tibberStartsAt).val;
                                            //if(logOn) console.log(myName + " aktPrice "+aktPrice+", aktStartAt "+aktStartAt);
                                            //let itemData ={t:0, y:0.0};
                                            //itemData['t']=unixTimestamp+3600*offset;
                                            //itemData['y']=aktPrice;
                                            values.push(Math.round(aktPrice*1000)/10.0);
                                            var cents=(Math.round(aktPrice*1000)/10.0).toString();
                                            datalabels.push(cents);
                                     
                                        }
                                        chart.graphs[0].data=values;
                                        chart.graphs[0].datalabel_override=datalabels;
                                        chart.data=values;
                                        chart.datalabel_override=datalabels;
                                        chart.axisLables=axisLabels;
                                     
                                        setState("javascript."+instance+"."+idChartData, JSON.stringify(chart));
                                     
                                    };
                                    

                                    1 Antwort Letzte Antwort
                                    0
                                    • T Offline
                                      T Offline
                                      theGrinch
                                      schrieb am zuletzt editiert von
                                      #58

                                      Ich hätte da noch eine Idee zur Erweiterung der Ausgabe bei EPEX: Kosten.

                                      Startzeitpunkt und Endzeitpunkt des Geräts werden ja ausgegeben, sind also bekannt.
                                      Die Preise via Tibber auch.
                                      Verbrauch sowieso.
                                      Also könnte man entweder den Näherungswert (Kosten in den Stunden wo Gerät gelaufen ist mitteln * Verbrauch) oder spezifischer (Stunde 1 + Stunde 2 + (Stunde 3/60*Anzahl gelaufener Minuten) zum jeweiligen Preis) berechnen.
                                      Näherungswert würde vermutlich reichen, da ja auch der Verbrauch nicht linear ist - den jetzt noch stündlich zu tracken ist etwas overkill denke ich.

                                      Ich bin nicht so wirklich drin im Rechnen mit Zeiten im Blockly. Wenn das jemand aus dem Ärmel schüttelt: gerne. Sonst arbeite ich mich da bei Gelegenheit mal rein.

                                      T 1 Antwort Letzte Antwort
                                      0
                                      • T theGrinch

                                        Ich hätte da noch eine Idee zur Erweiterung der Ausgabe bei EPEX: Kosten.

                                        Startzeitpunkt und Endzeitpunkt des Geräts werden ja ausgegeben, sind also bekannt.
                                        Die Preise via Tibber auch.
                                        Verbrauch sowieso.
                                        Also könnte man entweder den Näherungswert (Kosten in den Stunden wo Gerät gelaufen ist mitteln * Verbrauch) oder spezifischer (Stunde 1 + Stunde 2 + (Stunde 3/60*Anzahl gelaufener Minuten) zum jeweiligen Preis) berechnen.
                                        Näherungswert würde vermutlich reichen, da ja auch der Verbrauch nicht linear ist - den jetzt noch stündlich zu tracken ist etwas overkill denke ich.

                                        Ich bin nicht so wirklich drin im Rechnen mit Zeiten im Blockly. Wenn das jemand aus dem Ärmel schüttelt: gerne. Sonst arbeite ich mich da bei Gelegenheit mal rein.

                                        T Offline
                                        T Offline
                                        ThomKast
                                        schrieb am zuletzt editiert von ThomKast
                                        #59

                                        @thegrinch

                                        Magst Du mal aufzeigen, wozu die Kosten eines einzelnen Wasch-/Spülvorgang interessant sind? Der Verbrauch wird ja bereits ausgewiesen...
                                        Betreibst Du einen Waschsalon?😂?

                                        Was ich noch nicht beschrieben habe, ist eine Stunden-/Tages-/Monats-Abrechnung anhand der stündliche Preise. Also quasi als Kontrolle der Tibber-Abrechnung und um die Monatskosten während der Entstehung beurteilen zu können...
                                        Wollte aber den ersten Abrechnungsmonat abwarten, um keinen Blödsinn zu veröffentlichen.

                                        T 1 Antwort Letzte Antwort
                                        0
                                        • T ThomKast

                                          @thegrinch

                                          Magst Du mal aufzeigen, wozu die Kosten eines einzelnen Wasch-/Spülvorgang interessant sind? Der Verbrauch wird ja bereits ausgewiesen...
                                          Betreibst Du einen Waschsalon?😂?

                                          Was ich noch nicht beschrieben habe, ist eine Stunden-/Tages-/Monats-Abrechnung anhand der stündliche Preise. Also quasi als Kontrolle der Tibber-Abrechnung und um die Monatskosten während der Entstehung beurteilen zu können...
                                          Wollte aber den ersten Abrechnungsmonat abwarten, um keinen Blödsinn zu veröffentlichen.

                                          T Offline
                                          T Offline
                                          theGrinch
                                          schrieb am zuletzt editiert von
                                          #60

                                          @thomkast Argumentationshilfe gegenüber der besseren Hälfte:

                                          Schau mal Schatz, epex hat xy gekostet, dein 'muss unbedingt jetzt passieren' Waschgang 3x so viel.

                                          Schau mal Schatz, der Gang zum Wäscheständer hätte diesen Monat xy Trocknerkosten gespart.

                                          Und weil ich ein Spielkind bin und es geht!

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          353

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          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
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe