NEWS
SOLVED Ölpreis
-
@Oliver-Böhm sagte in (gelöst) Ölpreis:
Wenn ich es in den Beitrag einfügen möchte, heißt es immer, der Beitrag ist zu lang.
Als Datei hochladen.........Rechst neben dem Wolke Icon.
-
-
Hallo zusammen,
ich habe die Warnmeldungen aus dem 2. Script "Heizölpreis am Wohnort" beseitigen können.
Hier das neue Script:
/* Ö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" Quelle: www.esyoil.com */ var logging = false; var link = getState('javascript.0.Heizoel.Bestelldaten.Weblink').val; // 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 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'; 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: '' }); 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">', // erstes Auftauchen text2 = ' €</li>'; // erstes Auftauchen 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 = price.toFixed(2); price = parseFloat(price); priceLB = price / 50; 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)); // Wert in Objekt schreiben setState(idMwStL, parseFloat(MwStL,10)); // Wert in Objekt schreiben } function findZuschlag (body) { var text1 = '<dd data-polyfill-hidden class="delivery-charge">+ ', // erstes Auftauchen text2 = '<dt data-polyfill-hidden class="vat">'; // erstes Auftauchen var zuschlag = extractText(body,text1,text2); var zuschlagLN = zuschlag.replace(" €</dd>",""); var zuschlag_array = zuschlagLN.split(','); zuschlagLN = zuschlag_array[0] + '.' + zuschlag_array[1]; //zuschlagLN = zuschlagLN.toFixed(2); zuschlagLN = parseFloat(zuschlagLN); setState(idZuschlagN, parseFloat(zuschlagLN,10.00)); var zuschlagG = zuschlagLN * 49.8; zuschlagG = zuschlagG.toFixed(2); zuschlagG = parseFloat(zuschlagG); var priceLN = priceLB - MwStL - zuschlagLN; priceLN = priceLN.toFixed(2); priceLN = parseFloat(priceLN); var priceGN = price - MwStG - zuschlagG; priceGN = priceGN.toFixed(2); priceGN = parseFloat(priceGN); if (logging) log('Zuschlag: ' + zuschlagLN + ' EUR'); setState(idZuschlagGN, parseFloat(zuschlagG,10)); setState(idPriceLN, parseFloat(priceLN,10)); // Wert in Objekt schreiben setState(idPriceGN, parseFloat(priceGN,10)); // Wert in Objekt schreiben } function findLieferant (body) { var text1 = '<div data-polyfill-hidden style="width:330px;word-wrap:break-word;">', // erstes Auftauchen text2 = '<br data-polyfill-hidden>'; // erstes Auftauchen var lieferant = extractText(body,text1,text2); lieferant = lieferant.replace(" ",""); lieferant = lieferant.replace(/ /g," "); setState(idLieferant, lieferant); // Wert in Objekt schreiben } function findWebseite (body) { var text1 = '<a class="img provider-logo-container" tabindex="-1" href="', // erstes Auftauchen text2 = 'class="lazy provider-logo'; // erstes Auftauchen 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"> 90530 Wendelstein von ', // erstes Auftauchen + 1 Tag text2 = ' Uhr</span> </h1>'; // erstes Auftauchen var time = extractText(body,text1,text2); 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 leseWebseite () { try { request(link, function (error, response, body) { if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body findPrice (body); findZuschlag (body); findLieferant (body); findWebseite (body); findDate (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);
Hier das angepasste View:
Heizölview.txt -
DVielen Dank das du das teilst Kann ich "bald" echt gut brauchen.
-
@Oliver-Böhm
tolle arbeit
-
@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. -
ich hole die Daten nicht von Heizöl24, sondern von esyoil, eventuell musst du den Link für Österreich anpassen.
Gruß Oliver -
@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 €/100lWenn das stimmen würde, würde sofort eine Großbestellung raus gehen
-
@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 DESorry, Skript ist für mich Bahnhof.........bin eher der Vis Freund.........
-
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.
-
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. -
@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.
-
@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. -
@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;
-
@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.
-
Hallo zusammen,
anbei ein kleines Update:
- Vis wurde neu gestaltet, die Bestelldaten können jetzt im Vis direkt über Textfelder und Dropdownfelder eingestellt werden.
- 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.
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.
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.
Script 4: Wird ausgeführt, sobald sich nach einer Preisabfrage der günstigste Anbieter ändert. Hier werden die Daten des Anbieters abgefragt.
Script 5: Wird alle 59 Minuten ausgeführt. Hier wird die Differenz zum Vortag abgefragt.
Verbesserungen der Scripte, Fehlermeldungen und Anregungen nehme ich gerne entgegen.
Gruß
Oliver -
@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. -
wie gesagt, bin blutiger Anfänger in Sachen Javascript.
Danke für den Hinweis, ich wusste nicht mal, dass es einen Js-Editor gibt.
-
@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?
-
eigentlich wollte ich damit erreichen, dass er mir 2 Nachkommastellen übergibt.