Open Pix--- opened 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
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
Ein Link zum Tankstellenfinder auf der Konfigurationsseite Adapterkonfiguration->Tankstellen wäre schön.
Hallo, welchen Link meinst Du?
@Pix--- Erstmal Danke für den Adapter, läuft schon längere Zeit zuverlässig. Hätte noch zwei Verbesserungswünsche:
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.
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
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
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
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.
Javascript Adapter Einstellungen öffnen /Instanzen/Javascript Schraubenschlüssel. Darin Zusätzlich npm-Module installieren. axios eintragen und speichern. Instanz wird neu gestartet. Kinderleicht.
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
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...
@maximilianfh Super Plus ist ein Premium Kraftstoff, diese wird nicht von der API angeboten, aus diesem Grund kann ich da auch nichts machen.
@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!
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.
@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.
Lose Ideensammlung für die Weiterentwicklung des Adapters:
Zufallsgenerator für die Startminute zwischen 1 und 4 bei Adapterstart (schedule("1 ")), um Häufungen der Abfragen beim Server abzufedern(läuft seit 2.0.0 mit eigenem Timer)