Navigation

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

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    SOLVED Ölpreis

    This topic has been deleted. Only users with topic management privileges can see it.
    • 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
                                          • R
                                            ReverZ @Oli last edited by

                                            @Oliver-Böhm

                                            Dann verstehe ich deinen Satz nicht: "ich wusste nicht mal, dass es einen Js-Editor gibt."

                                            Wie auch immer ... dann müsste dir der Parser im JS-Editor doch diese Fehler bereits anzeigen? Bei mir sind diese rot unterstrichen.

                                            O 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

                                            879
                                            Online

                                            31.9k
                                            Users

                                            80.3k
                                            Topics

                                            1.3m
                                            Posts

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