iobroker-community-adapters / ioBroker.tankerkoenig

Spritpreis Adapter für ioBroker
http://www.iobroker.net
MIT License
32 stars 12 forks source link

Ideen für die Weiterentwicklung #22

Open Pix--- opened 5 years ago

Pix--- commented 5 years ago

Lose Ideensammlung für die Weiterentwicklung des Adapters:

Schweizer75 commented 5 years ago

Ich benötige zuhause nur Super und auf der Arbeit nur Diesel, eine möglichkeit zu wählen welche Benzin sorte ich abfragen möchte wäre nicht schlecht!

grüsse

Pix--- commented 5 years ago

Es wird nicht die Sorte abgefragt, sondern die Station. Die Antwort ist dann die Liste der angebotenen Sorten mit Preisen und ob die Station geöffnet ist. Der Adapter nimmt natürlich alle Infos auf, die geliefert werden.

Sent with GitHawk

OLFDB commented 4 years ago

Ein Link zum Tankstellenfinder auf der Konfigurationsseite Adapterkonfiguration->Tankstellen wäre schön.

Pix--- commented 4 years ago

Hallo, welchen Link meinst Du?

m-s-b commented 4 years ago

@Pix--- Erstmal Danke für den Adapter, läuft schon längere Zeit zuverlässig. Hätte noch zwei Verbesserungswünsche:

ppb1308 commented 4 years ago

Hallo, wäre es möglich zu jeder Option ein Objekt "cheapest" als Boolean anzulegen und dies auf true zu setzen nach der Abfrage, wenn diese Station die günstigste der selektierten Stationen ist? Hintergrund: Ich möchte in der Vis die günstigste Station in einer anderen Farbe oder mit einem Badge im Tile darstellen, ich habe versucht das mittels binding in dem Metro String Tile im Feld Zustand ID zu realisieren, aber das geht leider irgendwie nicht. Daher wäre ein Boolean mit Kennzeichnung ob günstigste oder nicht toll.

Pix--- commented 4 years ago

Hallo @ppb1308, in nächster Zeit wird es kein Update geben, es sind Ferien und der Nachwuchs will beschäftigt werden :-D Du kannst über die Bindings allerdings schon die heraushebende Darstellung der günstigsten Station realisieren. Ich verstehe richtig, du hast für jede Station ein Metro Tile? Du kannst zB die Hintergrundfarbe über ein Binding ändern. Frag in dem Binding ab, ob der Preis von cheapest niedriger ist als der der aktuellen Station. Wenn ja, dann normale Darstellung. Wenn gleich (niedriger sollte eigentlich nicht möglich sein), dann ist es die Günstigste und bekommt eine andere Farbe. Das hat auch einen weiteren Vorteil: Es können mehrere Stationen mit gleich günstigem Preis markiert werden. Der Adapter führt nur eine günstigste auf, abhängig von der Listenposition in der Konfiguration.

Pix

KrX3D commented 3 years ago

Hi, im Tankstellenfinder bekommt man diese Werte:

[ { "id": "XXXXXXX-XXXX-4867-XXXX-13999a44915c", "name": "SB-Markttankstelle XXX XXX Str.", "brand": "SB-Markttankstelle", "street": "XXXXX Str.", "house_number": "1 b", "post_code": XXXXX, "place": "XXXXXXX", "lat": XX.XXX, "lng": XX.XXXX, "isOpen": true } ]

Es wäre schön, wenn all diese Punkte als Datenpunkte vorhanden wären. Mich interessiert vor allem die Adresse. Denn dann könnte ich die billigste Tankstelle abfragen und würde die Adresse dazu direkt an mein Navigationsystem im Auto bekommen

Hallo, welchen Link meinst Du?

Dieser Link ist wohl gemeint.

https://creativecommons.tankerkoenig.de/TankstellenFinder/index.html

Pix--- commented 3 years ago

Hi, im Tankstellenfinder bekommt man diese Werte:

[ { "id": "XXXXXXX-XXXX-4867-XXXX-13999a44915c", "name": "SB-Markttankstelle XXX XXX Str.", "brand": "SB-Markttankstelle", "street": "XXXXX Str.", "house_number": "1 b", "post_code": XXXXX, "place": "XXXXXXX", "lat": XX.XXX, "lng": XX.XXXX, "isOpen": true } ]

Es wäre schön, wenn all diese Punkte als Datenpunkte vorhanden wären. Mich interessiert vor allem die Adresse. Denn dann könnte ich die billigste Tankstelle abfragen und würde die Adresse dazu direkt an mein Navigationsystem im Auto bekommen

Hallo, welchen Link meinst Du?

Dieser Link ist wohl gemeint.

https://creativecommons.tankerkoenig.de/TankstellenFinder/index.html

Ich kann gerade den Adapter nicht updaten. Aber ich kann dir ein Skript anbieten, das genau das tut, was du machst. Es holt, bei Änderung des niedrigsten Preises die Details ab. Du musst axios in den Javascript Einstellungen als npm-Paket hinterlegen und dein persönlichen API oben im Skript eintragen. Es legt die Datenpunkte in der Javascript Instanz ab, dann kannst du sie weitervewenden.

/* test_spritcheapest_adresse

Skript meldet Adresse, wenn Cheapest im Tankerkoenig-Adapter sich ändert

Voraussetzung: axios ersetzt request

02.10.2021 von Pix erstellt

*/

const api = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"; // API des Users - Anonymisieren!

let logging = true; // (true;false) Logausgabe zentral schalten

if (logging) log("Skript " + name + " in der Javascript-Instanz " + instance + " gestartet");

const path = "Sprit.Tankerkoenig.billigsteTankstelle.Adresse.";
let idJSON =    path + "json";
// Objekte erstellen (mit Struktur)
createState(idJSON, {name: "Billigste Tankstelle - JSON"});

createState(path + "Name", {name: "Billigste Tankstelle - Name"});
createState(path + "Marke", {name: "Billigste Tankstelle - Marke"});
createState(path + "ID", {name: "Billigste Tankstelle - ID"});
createState(path + "Strasse", {name: "Billigste Tankstelle - Strasse"});
createState(path + "Hausnummer", {name: "Billigste Tankstelle - Hausnummer"});
createState(path + "PLZ", {name: "Billigste Tankstelle - PLZ"});
createState(path + "Ort", {name: "Billigste Tankstelle - Ort"});
createState(path + "GeoLaenge", {name: "Billigste Tankstelle - geografische Laenge", unit: "°"});
createState(path + "GeoBreite", {name: "Billigste Tankstelle - geografische Breite", unit: "°"});

async function loadDetails() {
    // StationID und API-Code aus Adapter auslesen und damit IP Abfragen
    let station_id = getState("tankerkoenig.0.stations.cheapest.diesel.station_id").val;

    let url = "https://creativecommons.tankerkoenig.de/json/detail.php?id=" + station_id + "&apikey=" + api;

    // @ts-ignore
    const axios = require("axios"); // In den Javascript Adapter Einstellungen hinterlegen

    try {
        let res = await axios.get(url);
        if (res.status == 200) {
            let result = res.data;
            let data = JSON.stringify(result, null, 2);
            setState(idJSON, data, function() {
                if (logging) log(data);
            });

            if (result) {
                if (logging) {
                    log("-------------- Spritpreise -----------");
                    log("Name:                     " + result.station.name); 
                    log("Marke:                    " + result.station.brand); 
                    log("ID:                       " + result.station.id); 
                    log("Strasse:                  " + result.station.street); 
                    log("Hausnummer:               " + (result.station.houseNumber === undefined) ? " " : result.station.houseNumber);
                    log("PLZ:                      " + result.station.postCode); 
                    log("Stadt:                    " + result.station.place); 
                    log("Geografische Breite:      " + result.station.lat + "°"); 
                    log("Geografische Länge:       " + result.station.lng + "°");  
                    log("--------------------------------------");                    
                }
                setState(path + "Name", result.station.name);
                setState(path + "Marke", result.station.brand);
                setState(path + "ID", result.station.id);
                setState(path + "Strasse", result.station.street);
                setState(path + "Hausnummer", (result.station.houseNumber === undefined) ? " " : result.station.houseNumber);
                setState(path + "PLZ", result.station.postCode);
                setState(path + "Ort", result.station.place);
                setState(path + "GeoBreite", result.station.lat);
                setState(path + "GeoLaenge", result.station.lng);

                log("Spritpreise eingelesen (billigste Tankstelle) - kein Fehler");

            }
        } else log("Spritpreise einlesen - Seitenfehler: " + res.statusText);
    } catch (err) {
        log("Try/Catch-Error " + err);
    }   // Ende request 
}

// Trigger-Datenpunkt
const idTrigger = "tankerkoenig.0.stations.cheapest.diesel.short";
// Bei Änderung Adresse nachladen
on(idTrigger, function(obj) {
    if (logging) log("Trigger ausgelöst, niedrigster Spritpreis geändert");
    loadDetails();
});
loadDetails(); // Bei Skriptstart
KrX3D commented 3 years ago

cool, vielen danke werde ich mal ausprobieren.

Du musst axios in den Javascript Einstellungen als npm-Paket hinterlegen

Könntest du mir genauer erklären wie ich dies hinbekomme? Ich bin relativ neu mit all dem ganzen.

EDIT: hat sich erledigt. Funktioniert nun.

Pix--- commented 3 years ago

Javascript Adapter Einstellungen öffnen /Instanzen/Javascript Schraubenschlüssel. Darin Zusätzlich npm-Module installieren. axios eintragen und speichern. Instanz wird neu gestartet. Kinderleicht. axios npm modul

KrX3D commented 3 years ago

Hi, noch ein kleiner Verbesserungsvorschlag. Es wäre schön wenn bei jeder Tankstelle noch die Öffnungszeiten eingepflegt würden, bsp.:

"openingTimes": [ { "text": "Mo-Fr", "start": "07:00:00", "end": "19:00:00" }, { "text": "Samstag", "start": "08:00:00", "end": "17:00:00" }

Ich hatte dein Script auch ein wenig angepasst. Vielleicht hilft es ja irgendjemanden.

Eine Variable "fuel", um nicht mehrmals den ausgewählten Sprit im script ändern zu müssen. Und es wird ein Datenpunkt "Adresse" mit der kompletten Adresse (inkl. <br*>) gesetzt. Macht die Darstellung in VIS einfacher. Der Trigger wurde auch von short auf station_id umgestellt, da bei mir das Script nicht immer ausgeführt wurde, wenn sich der Spritpreis nicht geändert hat, jedoch sich die Billigste Tankstelle verändert hat.

`/* test_spritcheapest_adresse

Skript meldet Adresse, wenn Cheapest im Tankerkoenig-Adapter sich ändert

Voraussetzung: axios ersetzt request

02.10.2021 von Pix erstellt 10.10.2021 von KrX - Variable "fuel" um den Sprit auszuwählen - e5, e10, diesel 10.10.2021 von KrX - Datenpunkt "Adresse" wird mit der kompletten Adresse inkl
erstellt. 10.10.2021 von KrX - trigger wurde von short auf station_id umgestellt. */

const api = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"; // API des Users - Anonymisieren!

let logging = true; // (true;false) Logausgabe zentral schalten

if (logging) log("Skript " + name + " in der Javascript-Instanz " + instance + " gestartet");

const fuel = "e5"; // e5, e10, diesel const path = "Tankerkoenig.billigsteTankstelle." + fuel + ".Adresse."; let idJSON = path + "json"; // Objekte erstellen (mit Struktur) createState(idJSON, {name: "Billigste Tankstelle - JSON"});

createState(path + "Name", {name: "Billigste Tankstelle - Name"}); createState(path + "Marke", {name: "Billigste Tankstelle - Marke"}); createState(path + "ID", {name: "Billigste Tankstelle - ID"}); createState(path + "Strasse", {name: "Billigste Tankstelle - Strasse"}); createState(path + "Hausnummer", {name: "Billigste Tankstelle - Hausnummer"}); createState(path + "PLZ", {name: "Billigste Tankstelle - PLZ"}); createState(path + "Ort", {name: "Billigste Tankstelle - Ort"}); createState(path + "GeoLaenge", {name: "Billigste Tankstelle - geografische Laenge", unit: "°"}); createState(path + "GeoBreite", {name: "Billigste Tankstelle - geografische Breite", unit: "°"}); createState(path + "Adresse", {name: "Billigste Tankstelle - Komplette Adresse"});

async function loadDetails() { // StationID und API-Code aus Adapter auslesen und damit IP Abfragen let station_id = getState("tankerkoenig.0.stations.cheapest." + fuel + ".station_id").val; let url = "https://creativecommons.tankerkoenig.de/json/detail.php?id=" + station_id + "&apikey=" + api;

// @ts-ignore
const axios = require("axios"); // In den Javascript Adapter Einstellungen hinterlegen

try {
    let res = await axios.get(url);
    if (res.status == 200) {
        let result = res.data;
        let data = JSON.stringify(result, null, 2);
        setState(idJSON, data, function() {
            if (logging) log(data);
        });

        if (result) {
            if (logging) {
                log("-------------- Spritpreise -----------");
                log("Name:                     " + result.station.name); 
                log("Marke:                    " + result.station.brand); 
                log("ID:                       " + result.station.id); 
                log("Strasse:                  " + result.station.street); 
                log("Hausnummer:               " + (result.station.houseNumber === undefined) ? " " : result.station.houseNumber);
                log("PLZ:                      " + result.station.postCode); 
                log("Stadt:                    " + result.station.place); 
                log("Geografische Breite:      " + result.station.lat + "°"); 
                log("Geografische Länge:       " + result.station.lng + "°"); 
                log("Adresse           :       " + result.station.brand + "<br>" + result.station.street + " " + result.station.houseNumber + "<br>" + result.station.postCode + " " + result.station.place);  
                log("--------------------------------------");                    
            }
            setState(path + "Name", result.station.name);
            setState(path + "Marke", result.station.brand);
            setState(path + "ID", result.station.id);
            setState(path + "Strasse", result.station.street);
            setState(path + "Hausnummer", (result.station.houseNumber === undefined) ? " " : result.station.houseNumber);
            setState(path + "PLZ", result.station.postCode);
            setState(path + "Ort", result.station.place);
            setState(path + "GeoBreite", result.station.lat);
            setState(path + "GeoLaenge", result.station.lng);
            setState(path + "Adresse", " " + result.station.brand + "<br>" + result.station.street + " " + result.station.houseNumber + "<br>" + result.station.postCode + " " + result.station.place);

            log("Spritpreise eingelesen (billigste Tankstelle) - kein Fehler");

        }
    } else log("Spritpreise einlesen - Seitenfehler: " + res.statusText);
} catch (err) {
    log("Try/Catch-Error " + err);
}   // Ende request 

}

// Trigger-Datenpunkt const idTrigger = "tankerkoenig.0.stations.cheapest." + fuel + ".station_id"; // Bei Änderung Adresse nachladen on(idTrigger, function(obj) { if (logging) log("Trigger ausgelöst, niedrigster Spritpreis geändert"); loadDetails(); }); loadDetails(); // Bei Skriptstart

maximilianfh commented 1 year ago

Hi, danke für den tollen Adapter! Was mir noch fehlt ist die Anzeige von Super Plus, ich kann nur E5, E10 und Diesel sehen...

xXBJXx commented 1 year ago

@maximilianfh Super Plus ist ein Premium Kraftstoff, diese wird nicht von der API angeboten, aus diesem Grund kann ich da auch nichts machen.

maximilianfh commented 1 year ago

@maximilianfh Super Plus ist ein Premium Kraftstoff, diese wird nicht von der API angeboten, aus diesem Grund kann ich da auch nichts machen.

Schade, da kann man nix machen... Vielen Dank für deine schnelle Antwort!

MARTHossR commented 1 year ago

Wäre schön, wenn der Name der Tankstelle im Adapter noch ein paar mehr Zeichen bekäme. Wenn ich bspw. den Namen analog tankerkoenig.de verwenden möchte, schneidet es mir die letzten Zeichen ab.

Im folgenden Beispiel heißt die Tanke im Adapter dann nur "Honsel TS Reichensac" { "id": "c59e635e-9dfa-4d0a-84e9-baf6fa06fcc1", "name": "Honsel TS Reichensachsen", "brand": "Honsel", "street": "Landstrasse", "house_number": "121", "post_code": 37287, "place": "Wehretal - Reichensachsen", "lat": 51.15746307373, "lng": 10.000196456909, "isOpen": true }

Aber eigentlich ist das Jammern auf ganz hohem Niveau. Der Adapter ist super.

xXBJXx commented 1 year ago

@MARTHossR Ich kann das Feld maximal auf 34 Zeichen setzen, mehr passt in das Feld der Card nicht, wenn es noch mehr sein soll, muss ich die gesamte card überarbeiten. Ich werde es im nächsten Release auf 34 Zeichen setzen.