Moin,
habe noch etwas mit node.js gespielt und das Script so erweitert, dass direkt ein PDF aus den Daten der Ladevorgänge ab dem angegebenen Datum erstellt wird. Eventuell hilft es ja jemandem als Ausgangspunkt für eigene Lösungen.
///
// Aufruf z.B. node rechnungErstellen.js "2021-03-01"
///
// Download von https://github.com/nightsha-de/npm-vwconnectapi
const api = require('npm-vwconnectapi');
// npm install pdfkit
const PDFDocument = require('pdfkit');
const fs = require('fs');
// Bitte anpassen
// Für welche RFID Karte soll die Abrechnung erstellt werden
var rfidSerial = "VW-KN.....";
var kosten = "0.3325";
var email= "....@....";
var password = "**********";
var name = "Max Mustermann";
// Datum ab dem die Rechnung erstellt werden soll muss beim Aufruf im Format 2021-03-01 übergeben werden
var rechnungAbErstellen=process.argv[2];
var summe_kwh = 0;
var summe_euro = 0;
var vwConn = new api.VwWeConnect();
var pdfDoc = new PDFDocument;
var tableTop = 200;
vwConn.setCredentials(email, password, "YourPin");
vwConn.setConfig("id"); // type
vwConn.getData()
// Titel etc.
pdfDoc.pipe(fs.createWriteStream(rechnungAbErstellen+"_AbrechnungWallbox.pdf"));
pdfDoc.fontSize(20).text("Dienstwagen "+name, {align: "center"});
pdfDoc.fontSize(20).text("Stromabrechnung Wallbox "+ rechnungAbErstellen, {align: "center"});
pdfDoc.fontSize(12).text("Preis pro KWH bei Lichtblick im Ökostromtarif : "+kosten+" cent", 50,150, {align: "left"});
// Überschrift der Tabelle
pdfDoc.font("Helvetica-Bold");
zeileErstellen(pdfDoc,tableTop,"Liste der Ladevorgänge","kWh","Kosten","RFIDCard");
pdfDoc.font("Helvetica");
var intervalid = setInterval(function() {
if (vwConn.finishedReading())
{
let i = 0;
let position = 0;
vwConn.homechargingRecords.forEach((record) =>
{
if (rfidSerial == record.rfid_card_serial_number && record.total_energy_wh>0 && record.start_date_time>rechnungAbErstellen )
{
summe_kwh = summe_kwh + record.total_energy_wh/1000;
summe_euro = summe_euro + record.total_energy_wh/1000*kosten;
position = tableTop + (i + 1) * 30;
zeileErstellen(pdfDoc,position,record.start_date_time,record.total_energy_wh/1000,parseFloat(record.total_energy_wh/1000*kosten).toFixed(2)+"€",record.rfid_card_serial_number);
i++;
}
}
);
// Summe und doppelte Unterstreichung der Summe
pdfDoc.font("Helvetica-Bold").fontSize(10)
.text("Summe:", 170, position+30,{underline: true })
.text(parseFloat(summe_kwh).toFixed(2)+ "kWh", 220, position+30)
.text(parseFloat(summe_euro).toFixed(2)+"€", 250, position+30,{ width: 90, align: "right",});
pdfDoc.lineWidth(1).moveTo(300, position+40).lineTo(345, position+40).stroke();
pdfDoc.lineWidth(1).moveTo(300, position+42).lineTo(345, position+42).stroke();
// PDF und Connection schließen
pdfDoc.end();
vwConn.onUnload();
clearInterval(intervalid);
}
}, 1000);
function zeileErstellen(doc, y, c1, c2, c3, c4) {
doc.fontSize(10).text(c1, 50, y).text(c2, 220, y).text(c3, 250, y, { width: 90, align: "right" }).text(c4, 400, y, { width: 140, align: "right" });
doc.strokeColor("#aaaaaa").lineWidth(1).moveTo(50, y+20).lineTo(550, y+20).stroke();
}