Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

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

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

      @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 Reply Last reply Reply Quote 0
      • T
        theGrinch last edited by

        @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 Reply Last reply Reply Quote 0
        • T
          theGrinch last edited by

          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 Reply Last reply Reply Quote 0
          • T
            ThomKast @theGrinch last edited by 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 1 Reply Last reply Reply Quote 0
            • T
              theGrinch @ThomKast last edited by

              @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!

              tugsi 1 Reply Last reply Reply Quote 2
              • tugsi
                tugsi @theGrinch last edited by

                @thegrinch
                Ich muss ein wenig schmunzeln gerade.
                Ich verstehe Dich und bin auch bei Dir.
                Das Thema hatte ich Ende letzten Jahres.
                Wir haben durch zusammenziehen 2 Waschmaschinen und 2 Trockner.
                99% der Wäsche landet im Trockner und ich habe vor 1,5 Jahren schon Sonoff Pow in den Zuleitungen zu den einzelnen Geräten angeschlossen, um den jeweiligen Verbrauch zu messen. (Bitte jetzt nichts über Messgenauigkeit etc., mir geht es hier nicht um den Euro genau).
                Jetzt war es natürlich einfach, da ich bisher einen "festen" Strompreis hatte (Tibber ab 1.3.2023).
                Und ich habe ihr auch immer gesagt, trockne doch mal an der Luft, das kostet zuviel Strom...

                Was soll ich sagen, am Jahresende kam sie auf mich zu, fragte, was haben wir denn im Jahr verbraucht an kWh für die Trockner und was hat es gekostet... Ich war selber erstaunt, für beide Trockner hatten wir knapp über 150€ im Jahr an Stromkosten..
                Da fing sie an zu lachen und sagte mir nur, dann gebe ich dir 10€ im Monat extra, dafür habe ich die Arbeit mit aufhängen etc nicht .. puff meine Argumentationskette war weg...
                Um ehrlich zu sein, hatte ich auch mit mehr gerechnet, aber ich musste ihr Recht geben.

                Was ich jetzt schon gemacht habe, ich habe eine Monitor im Flur hängen als Visualisierung, da sieht man sofort den stündlichen Strompreis von Tibber und ab März gehts los.
                Sie hat es verstanden, dass sie etwas darauf achten wird, wann sie die Waschmaschinen und Co anschmeisst. Aber ich bin auch ehrlich, ich erwarte nicht, dass sie den Timer auf nachts stellt und morgens vor der Arbeit noch alles ausräumt, einsortiert etc.. dazu hätte ich auch keine Lust.
                Man sollte da auch die Kirche im Dorf lassen. Für mich geht es nicht, immer den tiefsten Punkt zu treffen, dass kann ich nachts mit e-Auto laden machen, der Rest sollte zweckmäßig und im Alltag integrierbar sein.
                Und wenn ich dann mal statt für unter 20Cent, mal für knapp über 30Cent wasche, bin ich trotzdem noch günstiger als die mindestens 40Cent woanders.
                Interessant ist ja schon mal der Verbrauch wie @ThomKast schon schrieb.
                Im Zweifel kann man in so einem Fall händisch ausrechnen.
                Allerdings wenn jemand eine einfache Formel/Blockly/Script dafür hat, bin ich offen dafür 😉

                T 1 Reply Last reply Reply Quote 1
                • T
                  theGrinch @tugsi last edited by

                  @tugsi Touché würde ich sagen.

                  Ich hab das Skript aktuell für den Geschirrspüler im Einsatz und in den vis (Handy und Monitor) ein Dropdown für die einzelnen Nutzungsarten - sowie einen Shelly button1 der auch auf "sofort" schaltet. Damit lässt sich das echt gut nutzen.

                  WM kommt als nächstes, beim Trockner wird's bei uns scheitern weil die nasse Wäsche nicht so lange drin liegen soll.

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

                    @thegrinch Abgesehen von dem, was ich oben geschrieben habe, hat sie gesehen, was die PS4 verbraucht hat in dem Jahr... 😄 da sollte man(n) dann manchmal die Klappe halten *lach
                    Ich bin Elektriker und wir haben bei uns in der Industrieanlage quasi jeden Verbraucher erfasst und so ähnlich möchte ich auch, zumindestens so Verbrauchergruppen erfassen, einfach der Neugierde/Spieltrieb heraus, was fliesst wohin.
                    Ich denke nächste Woche hänge ich einen Shelly 3EM an den Durchlauferhitzer, meiner Meinung nach, der Hauptverbraucher, bei 2 Frauen im Hause, die gerne duschen und baden...

                    1 Reply Last reply Reply Quote 1
                    • S
                      shellyrulestheworld @ThomKast last edited by

                      @thomkast Ich habe jetzt das Blockly ein bisschen auf meine Bedürfnisse angepasst. Mit der Spümaschine kämpfe ich gerade noch ein bisschen wegen der Endeleistung und Dauer.

                      Das ist das Profil:
                      Screenshot 2023-01-23 151825.png Screenshot 2023-01-23 151750.png

                      das Ende zu bestimmen ist echt schwierig. Weil davor bleibt die Leistung ja öfters mal bei 0 und am Ende steht sie dann komplett auf 0. Und bei 0 wird halt nichts mehr aktualisiert und die Prüfung kommt dann nicht mehr rein.
                      Screenshot 2023-01-23 152258.png

                      Das hier waren meine ersten Versuchswerte:
                      Screenshot 2023-01-23 152326.png

                      tugsi 1 Reply Last reply Reply Quote 0
                      • tugsi
                        tugsi @shellyrulestheworld last edited by

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

                        das Ende zu bestimmen ist echt schwierig. Weil davor bleibt die Leistung ja öfters mal bei 0 und am Ende steht sie dann komplett auf 0. Und bei 0 wird halt nichts mehr aktualisiert und die Prüfung kommt dann nicht mehr rein.

                        Ich hab ein Blockly hier mal im Forum gefunden, der setzt einen Zähler, der alle 10s um einen erhöht wird und wenn dann der Wert über eine bestimmte Wattzahl geht, wird der Zähler wieder zurückgesetzt.
                        Wenn der Wert des Zählers X erreicht hat (x mal 10s), dann kommt die Meldung, Maschine fertig.
                        Ich habe das bei der Waschmaschine und Trockner, klappt recht gut, ausser bei bestimmten Programmen, wo lange Leerlaufzeiten sind, aber selbst die kannst ja mit dem Zählerwert anpassen.
                        Hier mal das Beispiel mit der Spülmaschine, nicht wundern über die Wattzahl, meine Spülmaschine verbraucht 3-4W wenn das Display an ist und es geht erst dann aus, wenn sie fertig ist, also hier bräuchte ich noch nicht mal den Zähler.
                        Bildschirm­foto 2023-01-24 um 00.22.54.png

                        1 Reply Last reply Reply Quote 1
                        • H
                          homecineplexx last edited by

                          Hallo
                          da ich mit Blockly wirklich sehr wenig anfange, hab ich sie mir runtergeladen, importiert und in JavaScript konvertieren lassen.
                          da gibs eine Funktion jsonataExpression, kann mir jemand kurz erklären was die so macht?

                          T 1 Reply Last reply Reply Quote 0
                          • T
                            ThomKast @homecineplexx last edited by

                            @homecineplexx
                            Wie wäre es mal mit Tante Google? Z. B. Jasonata.Org

                            H 1 Reply Last reply Reply Quote 0
                            • H
                              homecineplexx @ThomKast last edited by

                              @thomkast danke für diesen konstruktiven beitrag..hab ich gemacht

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

                                Okay, neue Frage.
                                Ich hatte es gerade zum 2. Mal, dass ich in einer günstigen Stunde (22 Uhr 06) den Geschirrspüler anstelle und er jetzt aber (mutmaßlich bis 23 Uhr) wartet um loszulegen.

                                Ich habe das Skript nicht genug durchdrungen, aber prüft es evtl nicht ob JETZT grad günstig ist?

                                Sonst funktioniert es übrigens so super, dass ich demnächst tibber die Steuerung mei er easee wallbox entziehen und das auch über das Skript lösen werde.

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

                                  @thegrinch
                                  Moinsen 🙂 Und Du hast das Script schon richtig verstanden...

                                  Wenn die Betriebsart bereits auf "epex" steht und die SM eingeschaltet wird, wird beim Erkennen des Spülbeginns erstmal die TSD abgeschaltet. Da nur stündlich auf die "günstigen Stunden" geprüft wird, beginnt der Reinigungsvorgang erst zur nächsten vollen Stunde.

                                  Das ist unglücklich. Sehe ich auch so. Hat mich bislang nicht gestört, da die Spülmaschine meist gegen 2200 eingeräumt ist und gestartet wird und die günstigen Stunden meist erst ab 2300 oder in den ersten Morgenstunden auftreten. Aber Du hast Recht... je nachdem wie groß der %-tuale Aufschlag ausfällt oder wann die SM eingeschaltet wird, kann auch eine aktuelle Stunde eine "günstige Stunde" sein.

                                  Wenn Du möchtest kannst Du gerne folgende Script-Erweiterung an 2 Stellen einbringen:

                                  1. Beim Prüfen auf einen Betriebsartwechsel:
                                    1b0b5afc-4298-4c3e-b1ec-e25c55311c97-image.pngDas ist für den Fall nötig, dass die SM bereits angelaufen ist und die TSD abgeschaltet wurde und erst danach in die Betriebsart "epex" gewechselt wird.

                                  2. Beim prüfen der TSD-Abschaltung:
                                    278ce8f1-bff9-4dd5-8b2e-0a0a836060da-image.png Das ist für die Fälle, in denen bereits die Betriebsart "epex" gesetzt ist und die SM in einer "günstigen Stunde" eingeschaltet wird. Dadurch wird direkt auf die "günstigen Stunden" geprüft.

                                  Du kannst nun entweder die Ergänzungen selbst einbauen, oder im ersten Thread das angepasst Geräte-Script runterladen.

                                  Ein Sichern des alten Scripts kann evtl. nicht schaden 😁 bf0b67d0-2a91-4b85-b800-63424a5ad9ce-image.png

                                  Vielen Dank für Deine Anregung und beste Grüße, Thomas

                                  T 1 Reply Last reply Reply Quote 0
                                  • T
                                    ThomKast @homecineplexx last edited by ThomKast

                                    @homecineplexx

                                    Ich kann Dir hier nicht die Grundlagen von JSON erklären. Grob gesagt ist es so was wie eine Adressierung. Ich vermute aber mal, Du meinst diese Stelle im Script...
                                    98ee9aa7-3b42-4772-bf13-f1475ef0feef-image.png

                                    In aller Kürze!..!

                                    Du hast die Preisinformationen im Datenpunkt: 0_userdata.0.Tibber.Stundenpreise_heute und die sehen unter "Objekte" so aus:
                                    d511999a-6563-468a-b30d-e544f9b202ec-image.png

                                    In der ersten Zeile erkennst Du schon den Aufbau
                                    0679af59-6adc-44ba-ba07-96705e037501-image.png
                                    Erst "data", dann "viewer", dann "homes" aber homes hat eine eckige Klammer "[" also wird "homes" durchnummeriert, dann "priceInfo", dann "tomorrow"" und "today", wobei "today" wieder eine eckige Klammer "[" hat, also wieder durchgezählt wird.

                                    Mit JSONATA-Ausdruck kannst Du nun auf die einzelnen Informationen in JSON-String quasi "adressieren". Ein Bsp mit vereinfachtem String:

                                    {"data":{"viewer":{"priceInfo":{"today":[{"total":0.3427,"energy":0.1548,"tax":0.1879,"startsAt":"2023-01-29T00:00:00.000+01:00"},{"total":0.3127,"energy":0.1297,"tax":0.183,"startsAt":"2023-01-29T01:00:00.000+01:00"}]}}}}

                                    Da die "total"-Werte mehrfach und in "[" enthalten sind, werden diese durchgezählt. Der erste Werte mit "0", der nächste mit "1" usw. - im Bsp. also nur 0 + 1.
                                    Um also den Gesamtpreis "total" in der ersten Stunde - also Stunde 00:00:00 bis 00:59:59 - abzufragen benutzt man JSONATA mit data.viewer.priceInfo.[0].total

                                    04bc00a8-246d-49a3-9156-b67f5563c81b-image.png

                                    Dieser Aufruf liefert den Wert "0,3427".

                                    Über 0e386903-1dc7-4082-9dbc-6dca063ea906-image.png würdest Du den reinen Aufschlag "tax" der zweiten Stunde - also von 01:00:00 bis 01:59:59) abfragen und damit "0,183" erhalten.

                                    Da wir mit JSON-Strings arbeiten, aber mit die Preis-Informationen als Zahlen benötigen, muss noch die "Wandlung nach ZAHL" erfolgen.

                                    Hoffe, es wird Dir damit etwas klarer. Für Grundlagen kann ich die Kurse von @haus-automatisierung empfehlen. Dort wird auch JSON erstklassig erläutert.
                                    Von Matthias habe ich 90% meines Wissens erlernt 👍

                                    H 1 Reply Last reply Reply Quote 1
                                    • H
                                      homecineplexx @ThomKast last edited by

                                      @thomkast danke danke...ich kenn mich mit JSON aus, nur hab ich den JSONATA noch nie gesehen davor.
                                      und ja jetzt ist es klar.
                                      ich verwende ja auch nicht Tibber, sondern Awattar und da schaut die JSON struktur natürlich anders aus. daher versuch ich das ganze auf meine probleme anzuwenden

                                      danke nochmals

                                      haus-automatisierung 1 Reply Last reply Reply Quote 0
                                      • haus-automatisierung
                                        haus-automatisierung Developer Most Active @homecineplexx last edited by

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

                                        ich verwende ja auch nicht Tibber, sondern Awattar

                                        Für Awattar gibts doch sogar einen Adapter.

                                        H 1 Reply Last reply Reply Quote 0
                                        • H
                                          homecineplexx @haus-automatisierung last edited by homecineplexx

                                          @haus-automatisierung ja, danke das weiß ich und den verwende ich auch, allerdings bringt der dir die Daten und wenn du die zeit eingibst in der dich die stunden interessieren, kommen die auch nicht korrekt, aber gut, das brauch ich ja auch nicht!

                                          plus es kommt ja dann auch noch die PV-Vorhersage dazu

                                          ___manalishi 1 Reply Last reply Reply Quote 0
                                          • T
                                            theGrinch @ThomKast last edited by

                                            @thomkast danke. Hab's eben angepasst und funktioniert! (aktuelle Stunde einfach dreist im Objekt dazugetragen zum Testen)

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            596
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

                                            awattar billig börse epex günstig strompreis stündlich tibber
                                            24
                                            156
                                            22295
                                            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