Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. Diagramm mit festen Werten in VIS - nur wie?

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Diagramm mit festen Werten in VIS - nur wie?

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

      Hallo.
      Ich nutze den neu entworfenen Adapter "Tibber".
      Der zeigt mir in den Objekten in stündlich verteilten Mappen die zukünftigen Strompreise der nächsten zwei Tage an.

      Diese möchte ich gerne in meiner VIS als Diagramm angezeigt bekommen, kam aber mit Flot und E-Charts nicht weiter, weil die ja ihre Daten aus der History beziehen.

      Gibt es eine Möglichkeit, so ein Diagramm zu realisieren? Ich verzweifel langsam...

      Grüße
      Michael

      f4dbd96f-e9b6-47b1-b175-228f4141c9b2-image.png

      F liv-in-sky 2 Replies Last reply Reply Quote 0
      • F
        Familienvater @Michaelnorge last edited by

        Moin,

        das Thema umtreibt mich auch, irgendjemand eine Idee, wie man 6-12 Werte als JSON in ein String-Objekt oder so packt, und das String-Objekt mit irgendeinem vis-Chart darstellen kann.

        Vielleicht kann man was aus einem Wettervorhersage-Widget "recyclen", wo stündliche/tägliche Temperaturvorhersage-Werte visualisiert werden?

        Danke,
        Christian

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

          @familienvater
          Duuuu?
          bist du das wirklich?

          Willkommen!
          Die Idee sit gut! habe ich noch nie drüber nachgedacht.
          Ich nehme an, dass sich die Werte "irgendwie" dynamisch verändern und dann auch immer aktuell dargestellt werden sollen.

          Während ich über eine Lösung nachdenke:
          Warum käme dann historisieren nicht in Frage?

          F 1 Reply Last reply Reply Quote 0
          • liv-in-sky
            liv-in-sky @Michaelnorge last edited by

            @michaelnorge

            mit material design widget - da kann man ein diagramm als json eingeben- bzw einendatenpunkt, der ein json beinhaltet

            material design json chart

            Image 3.png

            Homoran 1 Reply Last reply Reply Quote 1
            • Homoran
              Homoran Global Moderator Administrators @liv-in-sky last edited by Homoran

              @liv-in-sky sagte in Diagramm mit festen Werten in VIS - nur wie?:

              mit material design widget - da kann man ein diagramm als json eingeben- bzw einendatenpunkt, der ein json beinhaltet

              Danke!
              kenne ich nicht - nutze nur das sparkline Widget und das braucht auch history
              da muss ich mich doch mal mit dem neumodischen Kram beschäftigen 😉

              liv-in-sky 1 Reply Last reply Reply Quote 0
              • liv-in-sky
                liv-in-sky @Homoran last edited by

                @homoran ja - da muss ich auch immer wieder nachdenken, wie es einzustellen ist

                ich habe das damit gemacht, weil so schön "bunt"

                Image 4.png

                1 Reply Last reply Reply Quote 1
                • F
                  Familienvater @Homoran last edited by

                  @homoran

                  ja ich bin es wirklich...

                  Historisieren:
                  Es wäre ja eher "futurisieren", weil es geht ja um die Visualisierung der Strompreise der nächsten Stunden.
                  Historisieren im Sinne von ich schreibe die in eine Datenbank, und hebe mir nur die letzten (zukünftigen) x-Werte auf finde ich den absoluten Overkill, nur um 6-12 Werte zu historisieren eine komplette Datenbank-Instanz auf womöglich einem Raspi zuzufügen, plus 1-2 Adapter für Historisierung und Zugriff auf die historisierten Daten.

                  Nee, Motto ist: "keep it small and simple"...
                  Vis Material Design bin ich auch schon beim Suchen drüber gestolpert, das scheint sehr viel zu können, aber ich habe nur vis-material-advanced gefunden?

                  Danke,
                  Christian

                  liv-in-sky Homoran 2 Replies Last reply Reply Quote 0
                  • liv-in-sky
                    liv-in-sky @Familienvater last edited by

                    @familienvater

                    Image 5.png

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

                      @familienvater sagte in Diagramm mit festen Werten in VIS - nur wie?:

                      ich habe nur vis-material-advanced gefunden?

                      Dann bist du brav im stable - da gibbet das nicht

                      github:	0.5.59
                      latest:	0.5.9 for 3 months
                      stable:	-.-.-
                      

                      http://download.iobroker.net/list.html#sortCol=name&sortDir=0&filter=
                      #399

                      1 Reply Last reply Reply Quote 0
                      • F
                        Familienvater last edited by

                        @homoran

                        OK, ich habe es geschafft, das aus dem nicht-Stable zu Installieren, und auch aus dem großen Hilfe-Thread mit Beispiel-Daten was zu erzeugen (was mir mit der Anleitung anleine nicht gelungen ist).
                        Erstmal Danke an alle, dann wird mir heute sicherlich nicht mehr langweilig.

                        Danke,
                        Christian

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

                          @familienvater sagte in Diagramm mit festen Werten in VIS - nur wie?:

                          dann wird mir heute sicherlich nicht mehr langweilig.

                          Dann mal viel Spaß!

                          und zeig uns dein Ergebnis

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

                            Moin,

                            also mit dem JSON-Chart habe ich es nicht hinbekommen, aber mit dem Bar Chart hat es geklappt, und es ist ausreichend "hübsch":
                            2021-10-08_17h59_03.png

                            Zu meinem Code und als Entschuldigung: JavaScript ist nicht so meins :-), Kommentare sind immerhin überhaupt welche drin. Und die createChartData - Funktion ist das, was ich vergeblich für das JSON-Chart versucht hatte, vielleicht schleift das noch jemand rund...

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

                            Christian

                            Und hier noch das exportierte Widget

                            [{"tpl":"tplVis-materialdesign-Chart-Bar","data":{"oid":"javascript.0.tibber.prices.barChartData","g_fixed":false,"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","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":"#mdwTheme:vis-materialdesign.0.fonts.card.title","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":"#mdwTheme:vis-materialdesign.0.fonts.charts.value","valuesFontSize":"10","valuesPositionAnchor":"end","valuesPositionAlign":"top","valuesTextAlign":"center","yAxisPosition":"left","yAxisTitleColor":"#mdwTheme:vis-materialdesign.0.colors.charts.y_axis_title","yAxisTitleFontFamily":"#mdwTheme:vis-materialdesign.0.fonts.charts.y_axis_title","yAxisTitleFontSize":"#mdwTheme:vis-materialdesign.0.fontSizes.charts.y_axis_title","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.x_axis_title","xAxisTitleFontFamily":"#mdwTheme:vis-materialdesign.0.fonts.charts.x_axis_title","xAxisTitleFontSize":"#mdwTheme:vis-materialdesign.0.fontSizes.charts.x_axis_title","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":"","valuesRotation":"-90","valuesPositionOffset":"","valuesMaxDecimals":"1","valuesMinDecimals":"1"},"style":{"left":"420px","top":"248px","width":"410px","height":"213px"},"widgetSet":"materialdesign"}]
                            

                            liv-in-sky M Q 3 Replies Last reply Reply Quote 2
                            • liv-in-sky
                              liv-in-sky @Familienvater last edited by

                              @familienvater schaut doch gut aus !

                              Homoran 1 Reply Last reply Reply Quote 0
                              • Homoran
                                Homoran Global Moderator Administrators @liv-in-sky last edited by

                                @liv-in-sky sagte in Diagramm mit festen Werten in VIS - nur wie?:

                                @familienvater schaut doch gut aus !

                                und ist auch ausreichend bunt

                                @Familienvater
                                👍

                                1 Reply Last reply Reply Quote 1
                                • M
                                  Michaelnorge @Familienvater last edited by

                                  @familienvater Mensch wie geil!!!!
                                  Leider kann ich null Javascript und hab keine Ahnung, wie ich das hier bei mir einbinden kann!!

                                  Aber toll gemacht!!!

                                  F 1 Reply Last reply Reply Quote 0
                                  • F
                                    Familienvater @Michaelnorge last edited by

                                    @michaelnorge
                                    Hi,

                                    OK, etwas mehr Ahnung von JavaScript habe ich dann vielleicht schon, aber die Profis mögen mich/Dich etwas in die richtige Richtung schubsen:
                                    Einfach den JavaScript-Adapter installieren, dann bekommt man links ein neues "Icon" für JS Skripte, da erstellt man über das "+" ein neues JS-Script, und da kopiert man den Script-Code rein, kontrolliert ggf. noch mal die Datenpunkte die am Anfang definiert sind, speichert das ganze, und startet dann das Script.
                                    Solange Du nur eine Tibber-Instanz hast, und die auf der "0" läuft, sollte eigentlich auch alles passen, und beim ersten Start wird in der Javascript.0-Instanz ein Ordner tibber und darin prices erstellt, und darin liegt dann der barChartData - Datenpunkt, und der wird für das Bar Chart als Datenquelle benutzt.
                                    Aber mal ganz ehrlich: Was macht man mit ioBroker ohne Blockly/JavaScript, gerade wenn Du VIS nutzt?
                                    Vielleicht kann man das Bar Chart sogar "hart" an die Datenpunkte vom Tibber-Adapter hängen, dann fehlt aber das in "1, 2, 3 usw. Stunden", da geht höchstens um 0 Uhr Heute ist immer der erste Balken, 1 Uhr immer der 2. usw.

                                    Und zumindest, wenn man "Irgendwie" öfters, mit egal welcher Programmiersprache zu tun hat, der Einstieg in einfaches JavaScript + ioBroker ist gar nicht so schwer, aber man kann damit das Home wirklich "smarter" machen.

                                    Christian

                                    M 1 Reply Last reply Reply Quote 0
                                    • M
                                      Michaelnorge @Familienvater last edited by

                                      @familienvater Kleines Missverständnis: Ich nutze Blockly, ausschließlich Blockly. Seit Jahren! Aber vom eigentlichen Scripten verstehe ich nichts 😉

                                      Ich schau mir Deinen Script mal näher an, sobald es die Zeit zulässt.

                                      Super Arbeit!

                                      Pit 1 Reply Last reply Reply Quote 0
                                      • T
                                        theGrinch last edited by

                                        Script für den neueren tibberconnect Adapter angepasst:

                                        Einfach das "home" reinkopieren in Zeile 6+7.

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

                                        vowill 1 Reply Last reply Reply Quote 0
                                        • vowill
                                          vowill @theGrinch last edited by vowill

                                          Für alle, die den ECharts-Adapter bereits am Laufen haben, hier eine Blockly-Lösung für die grafische Darstellung der Preise heute und Preise Morgen:
                                          Nachtrag 25.12.2023: Hier ein Foto des zugehörigen Pop-up-Views in vis:

                                          20231225 Tibber-Ansicht.jpg

                                          • Der Tibber-Adapter legt seine Daten im Objektbaum unter ‚tibberlink.0.Homes.xxx.PricesToday‘ und ‚tibberlink.0.Homes.83xx.PricesTomorrow‘ ab. Dort gibt es jeweils einen JSON-Datenpunkt, in dem die Werte für den ganzen Tag gespeichert sind.

                                          • Der ECharts-Adapter kann optional einen JSON-Datenpunkt einlesen und darstellen, wenn die Daten im Format
                                            [{„ts“: 1675887847000, „val“: 45}, {„ts“: 1675887848000, „val“: 77}, {„ts“: 1675887849000, „val“: 180} ]
                                            vorliegen (siehe https://github.com/ioBroker/ioBroker.echarts#readme).

                                          Damit benötigt es ein Skript, das die beiden JSON-Datenpunkte aus Tibber in einen JSON-Datenpunkt für ECharts konvertiert.
                                          Hier eine schnelle Skript-Lösung (mit Ablage des Ergebnisses im String-Datenpunkt ‚0_userdata.0.Stromversorgung.Tibber-Preise‘; der Wert 83xx im Skript ist vor dem Import durch die jeweilige Tibber-ID zu ersetzen):
                                          [Nachtrag 01.12.2023: Das zugrunde liegende Blockly-Script konnte ich aufgrund seiner Größe hier nicht hochladen; ich stelle es auf Nachfrage aber gerne per Mail zur Verfügung. Im nachfolgenden Skript (hier das (Update vom 07.12.2024) wird noch zusätzlich der Datenpunkt ‚0_userdata.0.Stromversorgung.Tibber-Mittelwerte‘ befüllt, um im Chart auch Linien für die jeweiligen Tages-Mittelwerte einzublenden.]

                                          var nur_Daten_fuer_heute, Quelldaten, JSON_fuer_ECharts, letzte_Laenge, average_price, Schleifenzaehler;
                                          
                                          
                                          // Daten von Tibber auf Änderung prüfen
                                          on({ id: [].concat(['tibberlink.0.Homes.83xx.PricesToday.json']).concat(['tibberlink.0.Homes.83xx.PricesTomorrow.json']), change: 'ne' }, async (obj) => {
                                            // warten bis alle Daten stabil sind:
                                            await wait(5000);
                                            // prüfen, für welche Tage Daten da sind:
                                            // Prices.Tomorrow
                                            if (getState('tibberlink.0.Homes.83xx.PricesTomorrow.json').val == '[]') {
                                              nur_Daten_fuer_heute = true;
                                            } else {
                                              nur_Daten_fuer_heute = false;
                                            }
                                            // Daten von Tibber holen:
                                            Quelldaten = getState('tibberlink.0.Homes.83xx.PricesToday.json').val;
                                            if (!nur_Daten_fuer_heute) {
                                              // Zusammenführung in eine Variable:
                                              // zuerst Daten von heute rechtsbündig bereinigen:
                                              while (Quelldaten.charAt((Quelldaten.length - 1)) != '}') {
                                                Quelldaten = Quelldaten.slice(0, Quelldaten.length - 1);
                                                // Zwangsabbruch, falls Endlosschleife droht:
                                                if (Quelldaten.length < 20) {
                                                  break;
                                                }
                                              }
                                              Quelldaten = [Quelldaten,', ',getState('tibberlink.0.Homes.83xx.PricesTomorrow.json').val.slice(1, getState('tibberlink.0.Homes.83xx.PricesTomorrow.json').val.length)].join('');
                                            }
                                            // Datenformat umwandeln:
                                            JSON_fuer_ECharts = '[{"ts": ';
                                            while (Quelldaten.indexOf('startsAt') + 1 > 0) {
                                              letzte_Laenge = Quelldaten.length;
                                              JSON_fuer_ECharts = [JSON_fuer_ECharts,getDateObject(getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.startsAt')).getTime(),', "val": '].join('');
                                              JSON_fuer_ECharts = [JSON_fuer_ECharts,getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.total'),'}, {"ts": '].join('');
                                              if (Quelldaten.indexOf('},') + 1 < 2) {
                                                break;
                                              }
                                              Quelldaten = '[' + String(Quelldaten.slice(((Quelldaten.indexOf('},') + 1 + 2) - 1), Quelldaten.length));
                                              // Zwangsabbruch, falls Endlosschleife droht:
                                              if (Quelldaten.length == letzte_Laenge) {
                                                break;
                                              }
                                            }
                                            JSON_fuer_ECharts = String(JSON_fuer_ECharts.slice(0, JSON_fuer_ECharts.lastIndexOf('}, {"ts":') + 1)) + ']';
                                            if (nur_Daten_fuer_heute) {
                                              // kein Datensatz für Morgen --> Werte generieren:
                                              average_price = getAttr((function () { try { return JSON.parse(JSON_fuer_ECharts); } catch (e) { return {}; }})(), '23.val');
                                              Quelldaten = JSON_fuer_ECharts;
                                              JSON_fuer_ECharts = String(Quelldaten.slice(0, Quelldaten.length - 1)) + ', {"ts": ';
                                              while (Quelldaten.indexOf('ts') + 1 > 0) {
                                                letzte_Laenge = Quelldaten.length;
                                                // Fortschreiben des letzten Tageswerts:
                                                JSON_fuer_ECharts = [JSON_fuer_ECharts,getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.ts') + 86400000,', "val": ',average_price,'}, {"ts": '].join('');
                                                if (Quelldaten.indexOf('},') + 1 < 2) {
                                                  break;
                                                }
                                                Quelldaten = '[' + String(Quelldaten.slice(((Quelldaten.indexOf('},') + 1 + 2) - 1), Quelldaten.length));
                                                // Zwangsabbruch, falls Endlosschleife droht:
                                                if (Quelldaten.length == letzte_Laenge) {
                                                  break;
                                                }
                                              }
                                              JSON_fuer_ECharts = String(JSON_fuer_ECharts.slice(0, JSON_fuer_ECharts.lastIndexOf('}, {"ts":') + 1)) + ']';
                                            }
                                            setState('0_userdata.0.Stromversorgung.Tibber-Preise' /* Tibber-Preise */, JSON_fuer_ECharts, true);
                                            // Datensatz für die Mittelwerte generieren:
                                            Quelldaten = JSON_fuer_ECharts;
                                            JSON_fuer_ECharts = '[{"ts": ';
                                            average_price = getState('tibberlink.0.Homes.83xx.PricesToday.average.total').val;
                                            Schleifenzaehler = 0;
                                            while (Quelldaten.indexOf('ts') + 1 > 0) {
                                              if (Schleifenzaehler == 24) {
                                                if (nur_Daten_fuer_heute) {
                                                  // letzter Tageswert bleibt stehen; danach Abbruch
                                                } else {
                                                  average_price = getState('tibberlink.0.Homes.83xx.PricesTomorrow.average.total').val;
                                                }
                                              }
                                              if (Schleifenzaehler == 25 && nur_Daten_fuer_heute) {
                                                break;
                                              }
                                              letzte_Laenge = Quelldaten.length;
                                              JSON_fuer_ECharts = [JSON_fuer_ECharts,getAttr((function () { try { return JSON.parse(Quelldaten); } catch (e) { return {}; }})(), '0.ts'),', "val": ',average_price,'}, {"ts": '].join('');
                                              if (Quelldaten.indexOf('},') + 1 < 2) {
                                                break;
                                              }
                                              Quelldaten = '[' + String(Quelldaten.slice(((Quelldaten.indexOf('},') + 1 + 2) - 1), Quelldaten.length));
                                              // Zwangsabbruch, falls Endlosschleife droht:
                                              if (Quelldaten.length == letzte_Laenge) {
                                                break;
                                              }
                                              Schleifenzaehler = (typeof Schleifenzaehler === 'number' ? Schleifenzaehler : 0) + 1;
                                            }
                                            JSON_fuer_ECharts = String(JSON_fuer_ECharts.slice(0, JSON_fuer_ECharts.lastIndexOf('}, {"ts":') + 1)) + ']';
                                            setState('0_userdata.0.Stromversorgung.Tibber-Mittelwerte' /* Tibber-Mittelwerte */, JSON_fuer_ECharts, true);
                                          });
                                          

                                          Im EChart muss dann lediglich als Quelle 'JSON' und ID '0_userdata.0.Stromversorgung.Tibber-Preise' angegeben werden; als Diagramm-Typ sollte 'Schritte' gewählt werden.
                                          Viel Erfolg!

                                          AllElectrified L I M B 6 Replies Last reply Reply Quote 0
                                          • Q
                                            qwertz @Familienvater last edited by

                                            @familienvater
                                            Danke dir für das Skript und Widget ! Nutze das mit dem euen Tibberlink Adapter.

                                            Klappt Prima. Ich musste nur bei Zeile 144 das "0" + entfernen, damit auch die einstelligen Stunden ausgelesen werden.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            471
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

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