Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Ölpreis

    NEWS

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    SOLVED Ölpreis

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

      DVielen Dank das du das teilst 😉 Kann ich "bald" echt gut brauchen.

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

        @Oliver-Böhm

        1how-marvin-the-paranoid-android-spends-his-weekends-klein.png tolle arbeit

        1 Reply Last reply Reply Quote 0
        • sigi234
          sigi234 Forum Testing Most Active @Oli last edited by sigi234

          @Oliver-Böhm

          Hallo, habe es mal getestet, Lieferantendaten bekomme ich keine.
          Ok, da muss ich im Skript auf Ösi umstellen, gibt es auch für at.

          https://www.heizoel24.at/

          Screenshot (3669).png

          O 1 Reply Last reply Reply Quote 0
          • O
            Oli @sigi234 last edited by

            @sigi234

            ich hole die Daten nicht von Heizöl24, sondern von esyoil, eventuell musst du den Link für Österreich anpassen.
            Gruß Oliver

            R sigi234 2 Replies Last reply Reply Quote 0
            • R
              ReverZ @Oli last edited by

              @Oliver-Böhm

              Re: (gelöst) Ölpreis

              Der Preis für 100l stimmt irgendwie nicht.

              Gesammtbrutto (für 3000 Liter): 2038.47 €
              Unter Heizöl -> Heizölpreis -> Allgemein -> Preis: 66.96 €

              Aber unter Heizöl ->Heizölpreis -> Wohnort -> Je 100L steht dann folgendes
              Je 100 L: 40.77 €/100l

              Wenn das stimmen würde, würde sofort eine Großbestellung raus gehen 😊

              O 1 Reply Last reply Reply Quote 0
              • sigi234
                sigi234 Forum Testing Most Active @Oli last edited by sigi234

                @Oliver-Böhm sagte in (gelöst) Ölpreis:

                Link für Österreich anpassen

                Wo und in welchen Skript?
                Ich glaube esyoli ist nur für DE

                Sorry, Skript ist für mich Bahnhof.........bin eher der Vis Freund.........😀

                O 1 Reply Last reply Reply Quote 0
                • O
                  Oli @ReverZ last edited by Oli

                  @ReverZ

                  was sagt den die Homepage von esyoli.com?
                  Sind auf der Homepage zusätzliche Lieferkosten aufgeführt?

                  Ich bin momentan unterwegs, ich schaue mir das heute Abend an.

                  R 1 Reply Last reply Reply Quote 0
                  • O
                    Oli @sigi234 last edited by

                    @sigi234

                    schau bitte erstmal, ob esyoli.com Ölpreise für Österreich bereitstellt.
                    Die Seite von Heizöl24 kann nicht geparst werden, da im Quellcode keine detailierte Informationen vorhanden sind.

                    1 Reply Last reply Reply Quote 0
                    • R
                      ReverZ @Oli last edited by

                      @Oliver-Böhm

                      Nein und der Gesamtpreis stimmt mit der Homepage überein.
                      Lediglich der 100L-Preis ist unterschiedlich.

                      In iobroker: 40.77 €/100l (brutto)
                      Auf der Website: 67,95 €/100l (brutto)

                      Danke, ich checke auch nochmal alle Orte die User-Konfiguration brauchen.

                      O 1 Reply Last reply Reply Quote 0
                      • O
                        Oli @ReverZ last edited by

                        @ReverZ
                        dann liegt es an den nicht vorhandenen zusätzlichen Lieferkosten, ist mir gestern schon aufgefallen, bin aber noch nicht dazu gekommen dies zu bereinigen.

                        R 1 Reply Last reply Reply Quote 0
                        • R
                          ReverZ @Oli last edited by ReverZ

                          @Oliver-Böhm

                          Nein, im Script wird einfach der Preis durch 50 dividiert

                          priceLB = price / 50;
                          
                          

                          Die 50 darf hier nicht hart codiert werden, da du von deinen 5000 Litern Gesamtmenge ausgegangen bist.
                          In dem Fall stimmt das Ergebnis natürlich. Wenn du aber - wie ich z.b.- 3000 Liter eingegeben hast, stimmt der 100L-Preis dann nicht mehr.

                          Müsste also entweder aus dem HTML ausgelesen werden oder errechnet durch

                          priceLB = price / <Liefermenge> * 100;
                          
                          O 1 Reply Last reply Reply Quote 0
                          • O
                            Oli @ReverZ last edited by

                            @ReverZ
                            stimmt, da hast du recht, daran merkt man, dass ich Script-Anfänger bin :-).

                            Für Verbesserungen oder Vereinfachung der Scripte bin ich immer dankbar.

                            1 Reply Last reply Reply Quote 0
                            • O
                              Oli last edited by

                              Hallo zusammen,

                              anbei ein kleines Update:

                              1. Vis wurde neu gestaltet, die Bestelldaten können jetzt im Vis direkt über Textfelder und Dropdownfelder eingestellt werden.

                              ab342e77-6001-46c2-99f0-3c8ecae13d6e-image.png

                              Heizölview.txt

                              1. Die Javascripts wurden angepasst und einige Fehler beseitigt. Danke für den Hinweis @ReverZ .

                              Die neuen Scripte füge ich im Anhang bei.

                              Script 1: Erstellt alle nötigen States, bitte einmal manuell ausführen.

                              /* Legt alle nötigen States an.
                                Dieses Schript zu Beginn einmal manuell ausführen.
                              */
                              
                              // ab hier nix mehr ändern, solange die Webseite die Daten nicht ändert
                              var idLiter            =   'Heizoel.Bestelldaten.Liefermenge',
                                 idPLZ              =   'Heizoel.Bestelldaten.Lieferort',
                                 idEntladestellen   =   'Heizoel.Bestelldaten.Entladestellen',
                                 idHeizölsorte      =   'Heizoel.Bestelldaten.Heizölsorte',
                                 idHeizölsorteID    =   'Heizoel.Bestelldaten.Heizölsorte ID',
                                 idBezahlung        =   'Heizoel.Bestelldaten.Zahlungsart',
                                 idBezahlungID      =   'Heizoel.Bestelldaten.Zahlungsart ID',
                                 idLink             =   'Heizoel.Bestelldaten.Weblink',
                                 idPriceGB          =   'Heizoel.Heizölpreis.Wohnort.Gesamt.Bruttopreis Gesamt',
                                 idPriceLB          =   'Heizoel.Heizölpreis.Wohnort.Je 100L.Bruttopreis 100l',
                                 idMwStL            =   'Heizoel.Heizölpreis.Wohnort.Je 100L.MwSt 100l',
                                 idMwStG            =   'Heizoel.Heizölpreis.Wohnort.Gesamt.MwSt Gesamt',
                                 idZuschlagN        =   'Heizoel.Heizölpreis.Wohnort.Je 100L.Nettozuschlag 100l',
                                 idZuschlagGN       =   'Heizoel.Heizölpreis.Wohnort.Gesamt.Nettozuschlag Gesamt',
                                 idPriceLN          =   'Heizoel.Heizölpreis.Wohnort.Je 100L.Nettopreis 100l',
                                 idPriceGN          =   'Heizoel.Heizölpreis.Wohnort.Gesamt.Nettopreis Gesamt',
                                 idLieferant        =   'Heizoel.Lieferant.Name',
                                 idWebseite         =   'Heizoel.Lieferant.Webseite',
                                 idPriceA           =   'Heizoel.Heizölpreis.Allgemein.Preis',
                                 idTrend            =   'Heizoel.Heizölpreis.Allgemein.Trend zum Vortag',
                                 idPercent          =   'Heizoel.Heizölpreis.Allgemein.Änderung zum Vortag',    
                                 idDate             =   'Heizoel.Datum';   
                                
                              createState(idLiter, {
                                name: 'Liefermenge',
                                desc: 'Liefermenge',
                                type: 'string',
                                unit: ' '
                              });
                              createState(idPLZ, {
                                name: 'Lieferort',
                                desc: 'Lieferort',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idEntladestellen, {
                                name: 'Entladestellen',
                                desc: 'Entladestellen',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idHeizölsorte, {
                                name: 'Heizölsorte',
                                desc: 'Heizölsorte',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idHeizölsorteID, {
                                name: 'Heizölsorte ID',
                                desc: 'Heizölsorte ID',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idBezahlung, {
                                name: 'Bezahlart',
                                desc: 'Bezahlart',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idBezahlungID, {
                                name: 'Bezahlart ID',
                                desc: 'Bezahlart ID',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idLink, {
                                name: 'Weblink von esyoil',
                                desc: 'Weblink von esyoil',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idPriceGB, {
                                name: 'Heizölpreis Gesamt Brutto',
                                desc: 'Heizölpreis Gesamt Brutto für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€'
                              });
                              
                              createState(idPriceLB, {
                                name: 'Heizölpreis je 100l Brutto',
                                desc: 'Heizölpreis je 100l Brutto für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€/100l'
                              });
                              
                              createState(idMwStL, {
                                name: 'Mehrwertsteuer je 100l',
                                desc: 'Mehrwertsteuer je 100l für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€/100l'
                              });
                              
                              createState(idMwStG, {
                                name: 'Mehrwertsteuer Gesamt',
                                desc: 'Mehrwertsteuer Gesamt für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€'
                              });
                              
                              createState(idZuschlagN, {
                                name: 'Zuschlag je 100l Netto',
                                desc: 'Zuschlag je 100l Netto für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€/100l'
                              });
                              
                              createState(idZuschlagGN, {
                                name: 'Zuschlag Gesamt Netto',
                                desc: 'Zuschlag Gesamt Netto für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€'
                              });
                              
                              createState(idPriceLN, {
                                name: 'Heizölpreis je 100l Netto',
                                desc: 'Heizölpreis je 100l Netto für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€/100l'
                              });
                              
                              createState(idPriceGN, {
                                name: 'Heizölpreis Gesamt Netto',
                                desc: 'Heizölpreis Gesamt Netto für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€'
                              });
                              
                              createState(idLieferant, {
                                name: 'Lieferant',
                                desc: 'Lieferant für heute',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idWebseite, {
                                name: 'esyoil.com Webseite von Lieferant',
                                desc: 'esyoil.com Webseite von Lieferant',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idDate, {
                                name: 'Datum',
                                desc: 'Heizölpreis Zeitstempel (als String)',
                                type: 'string',
                                def: ''
                              });
                              
                              createState(idPriceA, {
                                name: 'Heizölpreis für heute',
                                desc: 'Heizölpreis für heute',
                                type: 'number',
                                def: 0,
                                min: 0,
                                unit: '€/100l'
                              });
                              createState(idPercent, {
                                name: 'Heizölpreisänderung in Prozent zum Vortag',
                                desc: 'Heizölpreisänderung zum Vortag',
                                type: 'number',
                                def: 0,
                                min: 0,
                                max: 100,
                                unit: '%'
                              });
                              
                              createState(idTrend, {
                                name: 'Trend zum Vortag',
                                desc: 'Trend zum Vortag',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState('javascript.0.Heizoel.Skriptstart', false, {name: 'Skript bei VIS Tastendruck starten'});
                              
                              
                              
                              

                              Scripts 2: Wird ausgeführt, sobald sich in den Bestelldaten etwas ändert und der Abfragebutton betätigt wird. Es wird ein angepasster Link für die Preisabfrage erstellt.

                              /* Ölpreis abfragen
                              Auf diese Anfrage hin: http://forum.iobroker.net/viewtopic.php?f=8&t=3455
                              am 4.11.2016 getestet, nach Änderung der Webseite nun Fehler
                              Quelle: heizoel24.de
                              Basis: solar-wetter Skript
                              {1}
                              erstellt: 03.08.2016 von pix
                              12.11.2016 Webseite liefert nicht mehr Prognose, sondern Ist-Preis. Skript angepasst
                              29.08.2017 SKRIPT AUSGESCHALTET, DA NICHT IN GEBRAUCH
                              {2}
                              Angepasst am 14.07.2019 von Oliver Böhm, verwendet für "Bestelldaten für Heizölbestellung eintragen"
                              */
                              
                              on('javascript.0.Heizoel.Skriptstart', function (obj) {
                                 if (!obj.state.ack && obj.state.val) {
                              
                                     var logging = false;  
                                     var link = 'http://www.heizoel24.de/heizoelpreise';
                               
                                     // ab hier nix mehr ändern, solange die Webseite die Daten nicht ändert
                                     var request = require('request');
                                     var idheizöl = getState('javascript.0.Heizoel.Bestelldaten.Heizölsorte ID').val;
                                     var idzahlart = getState('javascript.0.Heizoel.Bestelldaten.Zahlungsart ID').val;
                                     var entladestellen = getState('javascript.0.Heizoel.Bestelldaten.Entladestellen').val;
                                     var liefermenge = getState('javascript.0.Heizoel.Bestelldaten.Liefermenge').val;                                       
                                     var lieferort = getState('javascript.0.Heizoel.Bestelldaten.Lieferort').val;                                        
                              
                                     var idLiter          =   'Heizoel.Bestelldaten.Liefermenge',
                                         idPLZ            =   'Heizoel.Bestelldaten.Lieferort',
                                         idEntladestellen =   'Heizoel.Bestelldaten.Entladestellen',
                                         idHeizölsorte    =   'Heizoel.Bestelldaten.Heizölsorte',
                                         idBezahlung      =   'Heizoel.Bestelldaten.Zahlungsart',
                                         idLink           =   'Heizoel.Bestelldaten.Weblink';   
                                 
                                     function findLink () {   
                                         if (idheizöl == "8") {
                                             heizölsorte = "Normal Schwefelarm";                    
                                         } else if (idheizöl == "4") {
                                             heizölsorte = "Premium Schwefelarm";                    
                                         } else if (idheizöl == "9") {
                                             heizölsorte = "Klimaneutral";                  
                                         }    
                                
                                         if (idzahlart == "1") {
                                             zahlart = "Barzahlung";                    
                                         } else if (idzahlart == "2") {
                                             zahlart = "EC-Karte";                    
                                         } else if (idzahlart == "4") {
                                             zahlart = "Lastschrift";                  
                                         } else if (idzahlart == "10") {
                                             zahlart = "Ratenkauf";                  
                                         } else if (idzahlart == "6") {
                                             zahlart = "Rechnung";                  
                                         } else if (idzahlart == "3") {
                                             zahlart = "Vorkasse";                  
                                         } else if (idzahlart == "5") {
                                             zahlart = "Wärmekonto";                  
                                         }
                               
                                         // Erstellung des Abfragelinks
                                         var url = 'https://www.esyoil.com/'  
                                           + '?calc%5Bzipcode%5D='          + lieferort
                                           + '&calc%5Bamount%5D='           + liefermenge
                                           + '&calc%5Bunloading_points%5D=' + entladestellen
                                           + '&calc%5Bprod%5D='             + idheizöl
                                           + '&calc%5Bpayment_type%5D='     + idzahlart 
                                           + '&calc%5Bexpress%5D=0&calc%5Bdelivery_date_sel%5D=&calc%5Bhose%5D=40m&calc%5Bshort_vehicle%5D=&calc%5Bsubmit%5D='         // driving = default
                                                         
                                         setState(idLink, url);                                           // Wert in Objekt schreiben
                                         setState(idBezahlung, zahlart);                                  // Wert in Objekt schreiben         
                                         setState(idHeizölsorte, heizölsorte);                            // Wert in Objekt schreiben
                                         setState('javascript.0.Heizoel.Skriptstart', "false");                            // Wert in Objekt schreiben
                                     }
                               
                                     function leseWebseite () {
                                         try {
                                                 request(link, function (error, response, body) {
                                             if (!error && response.statusCode == 200) {              // kein Fehler, Inhalt in body
                                                 findLink ();                              
                                                 log('Bestelldaten eingelesen');
                                             } else log(error,'error');                               // Error beim Einlesen
                                             });
                                         } catch (e) {
                                             log('Fehler (try) leseWebseite: ' + e, 'error');
                                         }   
                                     }
                               
                                     // bei Skriptstart
                                     leseWebseite();
                                 }
                              });
                                  
                              

                              Script 3: Wird ausgeführt, sobald sich in den Bestelldaten etwas ändert und der Abfragebutton betätigt wird und jede Stunde. Hier findet die eigentliche Preisabfrage für den Wohnort statt.

                              /* Ölpreis abfragen
                              Auf diese Anfrage hin: http://forum.iobroker.net/viewtopic.php?f=8&t=3455
                              am 4.11.2016 getestet, nach Änderung der Webseite nun Fehler
                              Quelle: heizoel24.de
                              Basis: solar-wetter Skript
                              {1}
                              erstellt: 03.08.2016 von pix
                              12.11.2016 Webseite liefert nicht mehr Prognose, sondern Ist-Preis. Skript angepasst
                              29.08.2017 SKRIPT AUSGESCHALTET, DA NICHT IN GEBRAUCH
                              {2}
                              Angepasst am 14.07.2019 von Oliver Böhm, verwendet für "Heizölpreis für Wohnort abfragen"
                              Dieses Script wird automatisch ausgeführt, sobald sich etwas in den Bestelldaten ändert, und alle 59 Minuten.
                              Quelle:  www.esyoil.com
                              */
                              
                              on({id:"javascript.0.Heizoel.Bestelldaten.Weblink", change: 'ne'}, function (obj) { 
                              var logging = false;
                              
                              // ab hier nix mehr ändern, solange die Webseite die Daten nicht ändert
                              var request = require('request');
                              var price;
                              var priceLB;
                              var MwStG;
                              var MwStL;
                              var zuschlag;
                              var zuschlagLN;
                              var Liefermenge = getState('javascript.0.Heizoel.Bestelldaten.Liefermenge').val;
                              var link = getState('javascript.0.Heizoel.Bestelldaten.Weblink').val;
                              var idPriceGB     =   'Heizoel.Heizölpreis.Wohnort.Gesamt.Bruttopreis Gesamt',
                                 idPriceLB     =   'Heizoel.Heizölpreis.Wohnort.Je 100L.Bruttopreis 100l',
                                 idMwStL       =   'Heizoel.Heizölpreis.Wohnort.Je 100L.MwSt 100l',
                                 idMwStG       =   'Heizoel.Heizölpreis.Wohnort.Gesamt.MwSt Gesamt',
                                 idZuschlagN   =   'Heizoel.Heizölpreis.Wohnort.Je 100L.Nettozuschlag 100l',
                                 idZuschlagGN  =   'Heizoel.Heizölpreis.Wohnort.Gesamt.Nettozuschlag Gesamt',
                                 idPriceLN     =   'Heizoel.Heizölpreis.Wohnort.Je 100L.Nettopreis 100l',
                                 idPriceGN     =   'Heizoel.Heizölpreis.Wohnort.Gesamt.Nettopreis Gesamt',
                                 idLieferant   =   'Heizoel.Lieferant.Name',
                                 idWebseite    =   'Heizoel.Lieferant.Webseite',      
                                 idDate        =   'Heizoel.Datum';
                              
                              function extractText(body,text1,text2) {
                                var start = body.indexOf(text1) + text1.length;
                                var ende = body.indexOf(text2,start);
                                if (logging) log('Startposition: ' + start);
                                if (logging) log('Endposition: ' + ende);
                                var zwischenspeicher;
                                if (((start != -1) && (ende != -1)) && (start<ende)) {                                                       // Fehler abfangen
                                    zwischenspeicher = body.slice(start,ende);
                                    zwischenspeicher = zwischenspeicher.trim();
                                    if (logging) log(zwischenspeicher);
                                    return(zwischenspeicher);
                                } else {
                                    zwischenspeicher = 'Fehler beim Ausschneiden';
                                    log(zwischenspeicher, 'error');
                                    return(0);
                                }
                              }
                              
                              function findPrice (body) {   
                                var text1 = '<li class="total_price_brutto">',                                                               
                                    text2 = '&thinsp;&euro;</li>';                                                                          
                                price = extractText(body,text1,text2); 
                                var price_array = price.split('.');
                                price = price_array[0] + price_array[1];     
                                price_array = price.split(',');
                                price = price_array[0] + '.' + price_array[1];   
                                price = parseFloat(price);
                                priceLB = price / Liefermenge * 100;
                                priceLB = priceLB.toFixed(2);   
                                priceLB = parseFloat(priceLB);      
                                MwStG = price / 119 * 19;
                                MwStG = MwStG.toFixed(2);
                                MwStG = parseFloat(MwStG);
                                MwStL = priceLB / 119 * 19;
                                MwStL = MwStL.toFixed(2);
                                MwStL = parseFloat(MwStL);
                                if (logging) log('Heizöl Preis: ' + price + ' EUR');
                              
                                setState(idPriceLB, parseFloat(priceLB,10));
                                setState(idPriceGB, parseFloat(price,10));
                                setState(idMwStG, parseFloat(MwStG,10));                                                                                    
                                setState(idMwStL, parseFloat(MwStL,10));                                                                                   
                              }
                              
                              function findLieferant (body) {
                                var text1 = '<div data-polyfill-hidden style="width:330px;word-wrap:break-word;">',		                    
                                    text2 = '<br data-polyfill-hidden>';                                                                     
                                var lieferant = extractText(body,text1,text2); 
                                lieferant = lieferant.replace(" ","");
                                lieferant = lieferant.replace(/&nbsp;/g," ");
                                
                                setState(idLieferant, lieferant);                                                                            
                              }
                              
                              function findWebseite (body) {
                                var text1 = '<a class="img provider-logo-container" tabindex="-1" href="',		                            
                                    text2 = 'class="lazy provider-logo';                                                                     
                                var web = extractText(body,text1,text2);
                                web = web.replace(/" "/g,"");
                                web = web.replace(/">/g,"");
                                web = web.replace(/<img/g,"");   
                                web = web.replace('"><imgclass="lazyprovider-logo"',"");
                                web = 'https://www.esyoil.com/heizoel-haendler/' + web;  
                              
                                setState(idWebseite, web);                                                                                   // Wert in Objekt schreiben
                              }  
                              
                              function findDate (body) {   
                                var text1 = '<strong>Aktuelle Heizölpreise</strong>:<span id="h4-until-base-3">',                            
                                    text2 = ' Uhr</span>    </h1>';                                                                          
                                var time = extractText(body,text1,text2);
                                var time_array = time.split('von');
                                time = time_array[1]; 
                                var datum = new Date();
                                var heute = datum.getDate() + "." + (datum.getMonth()+1) + "." + datum.getFullYear() + ", " + time ;
                                if (logging) log('Heizöl Datum: ' + heute);   
                                setState(idDate, heute);                                                                                     // Wert in Objekt schreiben
                              }
                              
                              function findZuschlagLN (body) {   
                                var text1 = '<li class="pricelist-entry" data-order="1"><!-- Dealer 2 BEGIN -->',                            
                                    text2 = '<dd data-polyfill-hidden class="delivery-charge">+&nbsp;';          
                                var start = body.indexOf(text1);
                                var ende = body.indexOf(text2);   
                                if (ende < start) {                                                                                          // Fehler abfangen, falls Zuschlag nicht vorhanden
                                     text1 = '<dd data-polyfill-hidden class="delivery-charge">+&nbsp;',                                      
                                     text2 = '<dt data-polyfill-hidden class="vat">';                                                         
                                     zuschlag = extractText(body,text1,text2);
                                     zuschlagLN = zuschlag.replace("&nbsp;€</dd>","");
                                } else {
                                     zuschlagLN = "0,00";
                                }   
                                var zuschlag_array = zuschlagLN.split(',');
                                zuschlagLN = zuschlag_array[0] + '.' + zuschlag_array[1];   
                                zuschlagLN = parseFloat(zuschlagLN);   
                                setState(idZuschlagN, parseFloat(zuschlagLN,10.00));
                                var priceLN = priceLB - MwStL - zuschlagLN;
                                priceLN = priceLN.toFixed(2);
                                priceLN = parseFloat(priceLN);
                                setState(idPriceLN, parseFloat(priceLN,10));   
                              }      
                              
                              function findZuschlagG (body) {
                                var text1 = '<li class="pricelist-entry" data-order="1"><!-- Dealer 2 BEGIN -->',                            
                                    text2 = '<dd data-polyfill-hidden class="delivery-charge">+&nbsp;';          
                                var start = body.indexOf(text1);
                                var ende = body.indexOf(text2);   
                                if (ende < start) {                                                      
                                    text1 = '<dt data-polyfill-hidden class="net">Gesamtbetrag <span data-polyfill-hidden class="description">(netto)</span></dt>',                                                   
                                    text2 = '<dt data-polyfill-hidden class="gross">Gesamtbetrag <span data-polyfill-hidden class="description">(brutto)</span></dt>';                                          
                                    var body = extractText(body,text1,text2);   
                                    text1 = '<dd data-polyfill-hidden class="delivery-charge">+&nbsp;',                                      
                                    text2 = '<dt data-polyfill-hidden class="vat">zzgl. 19 % gesetzl. MwSt.</dt>';                                                         
                                    var zuschlagG = extractText(body,text1,text2);        
                                    zuschlagG = zuschlagG.replace("&nbsp;€</dd>","");
                                } else {
                                    var zuschlagG = "0,00";
                                }  
                                var zuschlag_array = zuschlagG.split(',');
                                zuschlagG = zuschlag_array[0] + '.' + zuschlag_array[1];
                                zuschlagG = parseFloat(zuschlagG);   
                                var priceGN = price - MwStG - zuschlagG;
                                priceGN = priceGN.toFixed(2);
                                priceGN = parseFloat(priceGN);   
                                if (logging) log('Zuschlag: ' + zuschlagG + ' EUR');   
                                setState(idZuschlagGN, parseFloat(zuschlagG,10));                                                                                   
                                setState(idPriceGN, parseFloat(priceGN,10));                                                                                   
                              }
                              
                              function leseWebseite () {
                                try {
                                    request(link, function (error, response, body) {
                                        if (!error && response.statusCode == 200) {                                                          // kein Fehler, Inhalt in body
                                            findPrice (body);               
                                            findLieferant (body);
                                            findWebseite (body);
                                            findDate (body);
                                            findZuschlagLN (body);               
                                            findZuschlagG (body);               
                                            log('Heizöl-Preis von esyoil.com eingelesen');
                                        } else log(error,'error');                                                                           // Error beim Einlesen
                                    });
                                } catch (e) {
                                    log('Fehler (try) leseWebseite: ' + e, 'error');
                                }   
                              }
                              
                              // bei Skriptstart
                              leseWebseite();
                              
                              // Schedule
                              schedule("59 * * * *", leseWebseite);
                              });
                              
                              

                              Script 4: Wird ausgeführt, sobald sich nach einer Preisabfrage der günstigste Anbieter ändert. Hier werden die Daten des Anbieters abgefragt.

                              /* Ölpreis abfragen
                              Auf diese Anfrage hin: http://forum.iobroker.net/viewtopic.php?f=8&t=3455
                              am 4.11.2016 getestet, nach Änderung der Webseite nun Fehler
                              Quelle: heizoel24.de
                              Basis: solar-wetter Skript
                              {1}
                              erstellt: 03.08.2016 von pix
                              12.11.2016 Webseite liefert nicht mehr Prognose, sondern Ist-Preis. Skript angepasst
                              29.08.2017 SKRIPT AUSGESCHALTET, DA NICHT IN GEBRAUCH
                              {2}
                              Angepasst am 14.07.2019 von Oliver Böhm, verwendet für "Günstigsten Heizöl-Lieferanten abfragen".
                              Dieses Script wird automatisch ausgeführt, sobald sich nach einer Preisabfrage der günstigste Anbieter ändert.
                              Quelle:  www.esyoil.com
                              */
                              
                              on({id:"javascript.0.Heizoel.Lieferant.Webseite", change: 'ne'}, function (obj) {
                              var logging = false;
                              var link = getState('javascript.0.Heizoel.Lieferant.Webseite').val; 
                              
                              // ab hier nix mehr ändern, solange die Webseite die Daten nicht ändert
                              var request = require('request');
                              var strasse;
                              var plz;
                              var ort;
                              var fax;
                              var idAdresse = 'Heizoel.Lieferant.Adresse';
                              var idTelefon = 'Heizoel.Lieferant.Telefon';
                              var idFax     = 'Heizoel.Lieferant.Fax';
                              var idMail    = 'Heizoel.Lieferant.Mail';
                              
                              createState(idAdresse, {
                                name: 'Lieferantenadresse',
                                desc: 'Lieferantenadresse',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idTelefon, {
                                name: 'Lieferanten Telefonnummer',
                                desc: 'Lieferanten Telefonnummer',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idFax, {
                                name: 'Lieferanten Faxnummer',
                                desc: 'Lieferanten Faxnummer',
                                type: 'string',
                                unit: ' '
                              });
                              
                              createState(idMail, {
                                name: 'Lieferanten Mailadresse',
                                desc: 'Lieferanten Mailadresse',
                                type: 'string',
                                unit: ' '
                              });
                              
                              
                              function extractText(body,text1,text2) {
                                var start = body.indexOf(text1) + text1.length;
                                var ende = body.indexOf(text2,start);
                                if (logging) log('Startposition: ' + start);
                                if (logging) log('Endposition: ' + ende);
                                var zwischenspeicher;
                                if (((start != -1) && (ende != -1)) && (start<ende)) {                      // Fehler abfangen
                                    zwischenspeicher = body.slice(start,ende);
                                    zwischenspeicher = zwischenspeicher.trim();
                                    if (logging) log(zwischenspeicher);
                                    return(zwischenspeicher);
                                } else {
                                    zwischenspeicher = 'Fehler beim Ausschneiden';
                                    log(zwischenspeicher, 'error');
                                    return(0);
                                }
                              }
                              
                              function findStraße (body) {
                                var text1 = '"streetAddress": "',                                            // erstes Auftauchen
                                    text2 = '"email": [';                                                    // erstes Auftauchen
                                straße = extractText(body,text1,text2);
                                straße = straße.replace(/"/g,"");
                                straße = straße.replace(/,/g,"");   
                              }
                              
                              function findPLZ (body) {
                                var text1 = '"postalCode": "',                                               // erstes Auftauchen
                                    text2 = '"streetAddress": ';                                             // erstes Auftauchen
                                plz = extractText(body,text1,text2);
                                plz = plz.replace(/"/g,"");
                                plz = plz.replace(/,/g,"");   
                              }
                              
                              function findOrt (body) {
                                var text1 = '"addressLocality": "',                                          // erstes Auftauchen
                                    text2 = '"postalCode": "';                                               // erstes Auftauchen
                                ort = extractText(body,text1,text2);
                                ort = ort.replace(/"/g,"");
                                ort = ort.replace(/,/g,"");
                                setState(idAdresse, straße + ", " + plz + " " + ort);   
                              }
                              
                              function findTelefon (body) {
                                var text1 = '"telephone": "',                                                // erstes Auftauchen
                                    text2 = '"aggregateRating": ';                                           // erstes Auftauchen
                                var telefon = extractText(body,text1,text2);
                                telefon = telefon.replace(/"/g,"");
                                telefon = telefon.replace(/}/g,"");
                                telefon = telefon.replace(/,/g,"");
                                setState(idTelefon, telefon);   
                              }
                              
                              function findFax (body) {
                                var text1 = '"faxNumber": "',                                                // erstes Auftauchen
                                    text2 = '"telephone": "';                                                // erstes Auftauchen
                                fax = extractText(body,text1,text2);
                                if (fax.length > 15) {
                                    fax = "unbekannt";
                                } else {
                                     fax = fax.replace(/"/g,"");   
                                     fax = fax.replace(/,/g,"");
                                }    
                                setState(idFax, fax);   
                              }
                              
                              function findMail (body) {
                                if (fax == "unbekannt") {
                                     var text1 = '"email": [',                                                 // erstes Auftauchen
                                         text2 = '"telephone": "';                                             // erstes Auftauchen  
                                 } else {
                                     var text1 = '"email": [',                                                 // erstes Auftauchen
                                         text2 = '"faxNumber": "';                                             // erstes Auftauchen
                                 }                                                                 
                                var mail = extractText(body,text1,text2);      
                                mail = mail.replace(/"/g,"");
                                mail = mail.replace(/,/g,"");
                                mail = mail.replace(/]/g,"");
                                var mail_array = mail.split(' ');
                                mail = mail_array[0];
                                     
                                setState(idMail, mail);   
                              }                             
                              
                              function leseWebseite () {
                                try {
                                    request(link, function (error, response, body) {
                                        if (!error && response.statusCode == 200) {                          // kein Fehler, Inhalt in body
                                            findStraße (body);
                                            findPLZ (body);
                                            findOrt (body);
                                            findTelefon (body);
                                            findFax (body);
                                            findMail (body);
                                            log('Heizöl-Preis von esyoil.com eingelesen');
                                        } else log(error,'error');                                           // Error beim Einlesen
                                    });
                                } catch (e) {
                                    log('Fehler (try) leseWebseite: ' + e, 'error');
                                }
                              } 
                              
                              // bei Skriptstart
                              leseWebseite();
                              });
                              
                              

                              Script 5: Wird alle 59 Minuten ausgeführt. Hier wird die Differenz zum Vortag abgefragt.

                              /* Ölpreis abfragen
                              Auf diese Anfrage hin: http://forum.iobroker.net/viewtopic.php?f=8&t=3455
                              am 4.11.2016 getestet, nach Änderung der Webseite nun Fehler
                              Quelle: heizoel24.de
                              Basis: solar-wetter Skript
                              {1}
                              erstellt: 03.08.2016 von pix
                              12.11.2016 Webseite liefert nicht mehr Prognose, sondern Ist-Preis. Skript angepasst
                              29.08.2017 SKRIPT AUSGESCHALTET, DA NICHT IN GEBRAUCH
                              {2}
                              Angepasst am 14.07.2019 von Oliver Böhm, verwendet für "Heizölpreis Allgemein und Differenz zum Vortag abfragen".
                              Dieses Script wird automatisch alle 59 Minuten ausgeführt.
                              Quelle:  www.esyoil.com
                              */
                              
                              var logging = false;
                              var link = 'https://www.esyoil.com/%c3%b6lpreis';
                              
                              // ab hier nix mehr ändern, solange die Webseite die Daten nicht ändert
                              var request = require('request');
                              var idPriceA =   'Heizoel.Heizölpreis.Allgemein.Preis',
                                 idTrend =   'Heizoel.Heizölpreis.Allgemein.Trend zum Vortag',
                                 idPercent = 'Heizoel.Heizölpreis.Allgemein.Änderung zum Vortag';
                                 
                              function extractText(body,text1,text2) {   
                                var start = body.indexOf(text1) + text1.length;
                                var ende = body.indexOf(text2,start);
                                if (logging) log('Startposition: ' + start);
                                if (logging) log('Endposition: ' + ende);
                                var zwischenspeicher;
                                if (((start != -1) && (ende != -1)) && (start<ende)) {                      // Fehler abfangen
                                    zwischenspeicher = body.slice(start,ende);
                                    zwischenspeicher = zwischenspeicher.trim();
                                    if (logging) log(zwischenspeicher);
                                    return(zwischenspeicher);
                                } else {
                                    zwischenspeicher = 'Fehler beim Ausschneiden';
                                    log(zwischenspeicher, 'error');
                                    return(0);
                                }
                              }
                              
                              function findNewBody (body) {   
                                var text1 = '>Heizöl</a>',                                                   // erstes Auftauchen
                                    text2 = 'id="1-oelpreis-news"';                                          // erstes Auftauchen
                                var body = extractText(body,text1,text2);   
                              }
                              
                              function findPrice (body) {   
                                var text1 = '<td class="">',                                                 // erstes Auftauchen
                                    text2 = '€';                                                             // erstes Auftauchen
                                var price = extractText(body,text1,text2); 
                                var price_array = price.split(',');
                                price = price_array[0] + '.' + price_array[1];
                                price = parseFloat(price);
                                if (logging) log('Heizöl Preis: ' + price + ' EUR');
                                setState(idPriceA, parseFloat(price,10));                                     // Wert in Objekt schreiben
                              }
                              
                              function findPercent (body) {   
                                var text1 = '<span class=" text-success">',                                  // erstes Auftauchen
                                    text2 = '%</span>';                                                      // erstes Auftauchen    
                                var percent = extractText(body,text1,text2);   
                                var ausschnitt = percent.slice(0, 1);
                                percent = percent.replace(ausschnitt,"");   
                                var percent_array = percent.split(',');
                                percent = percent_array[0] + '.' + percent_array[1];
                                percent = parseFloat(percent);
                                if (logging) log('Heizöl Prozent: ' + percent.toFixed(2) + '%');
                                setState(idPercent, percent);                                                // Wert in Objekt schreiben
                                setState(idTrend, ausschnitt);                                               // Wert in Objekt schreiben
                              }
                              
                              function leseWebseite () {
                                try {
                                    request(link, function (error, response, body) {
                                        if (!error && response.statusCode == 200) {                          // kein Fehler, Inhalt in body
                                            findNewBody (body);
                                            findPrice(body);
                                            findPercent(body);               
                                            log('Heizöl-Preis von esyoil.com eingelesen');
                                        } else log(error,'error');                                           // Error beim Einlesen
                                    });
                                } catch (e) {
                                    log('Fehler (try) leseWebseite: ' + e, 'error');
                                }   
                              }
                              
                              // bei Skriptstart
                              leseWebseite();
                              
                              // Schedule
                              schedule("59 * * * *", leseWebseite);
                              

                              Verbesserungen der Scripte, Fehlermeldungen und Anregungen nehme ich gerne entgegen.

                              Gruß
                              Oliver

                              R liv-in-sky 3 Replies Last reply Reply Quote 0
                              • R
                                ReverZ @Oli last edited by ReverZ

                                @Oliver-Böhm

                                Danke für das Update!
                                Ich denke da sind noch etwas Optimierungspotential drin.
                                Was mir bis jetzt aufgefallen ist:
                                Im Script 2 werden variablen wie "heizölsorte" und "zahlart" verwenden ohne diese zuvor zu deklarieren. Der JS-Editor meckert das sofort an.

                                O 1 Reply Last reply Reply Quote 0
                                • O
                                  Oli @ReverZ last edited by

                                  @ReverZ

                                  wie gesagt, bin blutiger Anfänger in Sachen Javascript.

                                  Danke für den Hinweis, ich wusste nicht mal, dass es einen Js-Editor gibt.🙄

                                  R 1 Reply Last reply Reply Quote 0
                                  • R
                                    ReverZ @Oli last edited by ReverZ

                                    @Oliver-Böhm

                                    In Script 3 setzt du die parseFloat-Funktion ein, übergibst aber statt zwei statt einem Argument:

                                       setState(idPriceLB, parseFloat(priceLB,10));
                                       setState(idPriceGB, parseFloat(price,10));
                                       setState(idMwStG, parseFloat(MwStG,10));                                                                                    
                                       setState(idMwStL, parseFloat(MwStL,10)); 
                                    

                                    Was willst du mit der "10" jeweils erreichen?

                                    O 1 Reply Last reply Reply Quote 0
                                    • O
                                      Oli @ReverZ last edited by

                                      @ReverZ

                                      eigentlich wollte ich damit erreichen, dass er mir 2 Nachkommastellen übergibt.

                                      R 1 Reply Last reply Reply Quote 0
                                      • R
                                        ReverZ @Oli last edited by

                                        @Oliver-Böhm

                                        OK. Wie verifizierst du denn die Syntax von deinem JS-Code wenn nicht im JS-Editor?
                                        Schreibst du den Code in Notepad und lädst die fertige JS-Datei dann irgendwo hoch?

                                        O 1 Reply Last reply Reply Quote 0
                                        • R
                                          ReverZ @Oli last edited by ReverZ

                                          @Oliver-Böhm

                                          Dann musst du mit .toFixed(2) arbeiten, was du ja zuvor für priceLB schon gemacht hast:

                                             priceLB = priceLB.toFixed(2);   
                                             priceLB = parseFloat(priceLB);
                                          

                                          Ausserdem musst du dich mehr mit Datentypen auseinandersetzen.
                                          Mathematische Operationen kann man nur auf Zahlen anwenden. Einige Werte deklarierst du allerdings als Strings und verwendest diese später in math. Formeln.

                                          1 Reply Last reply Reply Quote 0
                                          • O
                                            Oli @ReverZ last edited by

                                            @ReverZ

                                            ich schreibe sie im ioBroker Javascript Editor und teste, ob es funktioniert und alles eingetragen wird.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate
                                            FAQ Cloud / IOT
                                            HowTo: Node.js-Update
                                            HowTo: Backup/Restore
                                            Downloads
                                            BLOG

                                            1.0k
                                            Online

                                            32.1k
                                            Users

                                            80.7k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            15
                                            65
                                            14213
                                            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