Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stromnetz Graz has new headers format #44

Closed
wants to merge 1 commit into from

Conversation

akargl
Copy link
Contributor

@akargl akargl commented May 12, 2024

Stromnetz Graz hat ein neues Exportformat:

Lieferrichtung: Bezug;;;;;;;;;
Ablesezeitpunkt;Zaehlerstand Gesamt - 1.8.0;Verbrauch Gesamt - 1.8.0;Status Gesamt - 1.8.0;Zaehlerstand Hochtarif - 1.8.1;Verbrauch Hochtarif - 1.8.1;Status Hochtarif - 1.8.1;Zaehlerstand Niedertarif - 1.8.2;Verbrauch Niedertarif - 1.8.2;Status Niedertarif - 1.8.2
2024-04-01T00:15:00.000+02:00;7902.695;0.155;VAL;;;;;;
2024-04-01T00:30:00.000+02:00;7902.828;0.133;VAL;;;;;;
2024-04-01T00:45:00.000+02:00;7902.861;0.033;VAL;;;;;;

Die Änderungen an den Headernamen sind natürlich trivial. Zusätzliches Problem ist aber das eine weitere Zeile Lieferrichtung: Bezug am Anfang eingefügt wird. Das verhindert das parsing das nur mit einer Headerzeile umgehen kann. Das zu ändern ist komplexer und bräuchte größere Umbauten.

Würde es Sinn machen z.b. eine extra Dropdownbox hinzuzufügen um manuell den Netzbetreiber auswählen können um das parsing zu vereinfachen? Kann mir auch vorstellen das es bei der automatischen Erkennung zu Konflikten kommen kann in Zukunft wenn Netzbetreiber gleiche Spaltennamen verwenden aber z.b. mit andere Einheit oder Formattierung.

@@ -158,9 +158,9 @@ export const LinzAG = new Netzbetreiber("LinzAG", "Energiemenge in kWh", "Datum
return parseFloat(usage.replace(",", "."));
}), ["Ersatzwert"], null, false);

export const StromnetzGraz = new Netzbetreiber("StromnetzGraz", "Verbrauch Einheitstarif", "Ablesezeitpunkt", null, "parseISO", (function (usage) {
export const StromnetzGraz = new Netzbetreiber("StromnetzGraz", "Verbrauch Gesamt - 1.8.0", "Ablesezeitpunkt", null, "parseISO", (function (usage) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bei so Formatänderungen führen wir normal eine neue Variante ein, um auch noch das alte Format zu unterstützen. Siehe z.B. NetzBurgenlandv2

@lewurm
Copy link
Collaborator

lewurm commented May 14, 2024

Danke @akargl!

Zusätzliches Problem ist aber das eine weitere Zeile Lieferrichtung: Bezug am Anfang eingefügt wird. Das verhindert das parsing das nur mit einer Headerzeile umgehen kann. Das zu ändern ist komplexer und bräuchte größere Umbauten.

Das machen ein paar andere Netzanbieter auch. Siehe

function stripPlain(buf) {
var input = bufferToString(buf);
// Kaernten Netz
//
// v1:
// > Kundennummer;XXXXXX
// > Kundenname;YYYYYYYY
// > ZP-Nummer;ATXXXXX00XXXX0000XX0XXX0XXXXXXXXX
// > Beginn;01.01.2020
// > Ende;29.03.2023
// > Energierichtung;Netzbezug
// >
// >
// > Datum;Zeit;kWh;Status
//
//
// v2:
// > Kundennummer;12345678;;
// > Kundenname;Mustermann Max;;
// > ZP-Nummer;AT0070000XXXX10000000000000XXXXXX;;
// > Beginn;27.03.2024;;
// > Ende;01.05.2024;;
// > Energierichtung;Verbrauch gemessen;;
// > ;;;
// > ;;;
// > Datum;Zeit;kWh;Status
//
if (input.includes("Kundennummer") && input.includes("Kundenname") && input.includes("ZP-Nummer") && input.includes("Energierichtung")) {
if (!input.includes("Netzbezug") && !input.includes("Verbrauch gemessen")) {
displayWarning("Falsche Daten (Einspeisepunkt?). Bitte Bezug waehlen");
return null;
}
return stringToBuffer(input.split("\n").slice(8).join("\n"));
}
// VorarlbergNetz
// > Vertragskonto;XXXXXXXXXXXX
// > Zählpunkt;ATXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
var input16le = decodeUTF16LE(buf);
if (input16le.includes("Vertragskonto;") && input16le.includes("Zählpunkt;")) {
return stringToBuffer(input16le.split("\n").slice(3).join("\n"));
}
// NetzBurgenland V2
// > Zählpunktbezeichnung;Kennzahl;Zählernummer;Exportiere ab;Exportiere bis;Exportiere ab;Exportiere bis
// > AT0090000000000000000000000049656;1-1:1.9.0 P.01;;01.08.2023;31.08.2023;00:00;00:00
// [.. data for bezug ..]
// > Zählpunktbezeichnung;Kennzahl;Zählernummer;Exportiere ab;Exportiere bis;Exportiere ab;Exportiere bis
// > AT0090000000000000000000000049656;1-1:1.9.0 P.01;;01.08.2023;31.08.2023;00:00;00:00
// [.. data for einspeisung ..]
function isBurgenlandv2Header(s) {
if (!s.includes("hlpunktbezeichnung")) {
return false;
}
if (!s.includes("Kennzahl")) {
return false;
}
if (!s.includes("hlernummer")) {
return false;
}
if (!s.includes("Exportiere ab")) {
return false;
}
return s.includes("Exportiere bis");
}
if (isBurgenlandv2Header(input)) {
var result = [];
// drop first two lines
input = input.split("\n").slice(2);
for (let i = 0; i < input.length; i++) {
var line = input[i];
if (isBurgenlandv2Header(line)) {
// second header found, drop lines from here on.
return stringToBuffer(result.join("\n"));
}
result.push(line);
}
// v3, yet another format discovered in the wild
return stringToBuffer(result.join("\n"));
}
// > PLZ Ort, Adresse [Zählpunktnummer];;;PLZ Ort, Adresse [Zählpunktnummer];;
// > Zählpunktnummer;;;Zählpunktnummer;;
// > Strom - Wirkenergie (kWh);;;Strom - Wirkenergie (kWh);;
// > kWh;;;kWh;;
// > DATE_FROM;DATE_TO;VALUE;DATE_FROM;DATE_TO;VALUE
function isTinetz(s) {
return s.includes("DATE_FROM;DATE_TO;VALUE;DATE_FROM;DATE_TO;VALUE");
}
if (isTinetz(input)) {
var lines = input.split("\n");
var s = lines.slice(4).join("\n");
var lastLine = lines.slice(-2)[0];
/* check if 15min values are on the left or right side (the CSV export also contains daily usages) */
if (lastLine.startsWith(";;;")) {
s = s.replace("DATE_FROM;DATE_TO;VALUE;DATE_FROM;DATE_TO;VALUE", "DATE_FROM;DATE_TO;VALUE;DATE_FROM2;DATE_TO2;VALUE2");
} else {
s = s.replace("DATE_FROM;DATE_TO;VALUE;DATE_FROM;DATE_TO;VALUE", "DATE_FROM2;DATE_TO2;VALUE2;DATE_FROM;DATE_TO;VALUE");
if (!lastLine.endsWith(";;;")) {
displayWarning("why tho TINETZ?!? Please report...");
}
}
/* normalize date format (= remove seconds) */
var t = s.replace(/ (\d\d:\d\d):00;/gm, " $1;");
return stringToBuffer(t);
}
// everything else
return buf;
}

Würde es Sinn machen z.b. eine extra Dropdownbox hinzuzufügen um manuell den Netzbetreiber auswählen können um das parsing zu vereinfachen?

Gerne in einen weiteren PR 🙂

Kann mir auch vorstellen das es bei der automatischen Erkennung zu Konflikten kommen kann in Zukunft wenn Netzbetreiber gleiche Spaltennamen verwenden aber z.b. mit andere Einheit oder Formattierung.

Ja, ehrlich gesagt wundert es mich eh wie gut wir sich bis jetzt durchwurschteln konnten. Meine Hoffnung ist dass die e-control was einheitliches durchsetzt, dann ist diese Netzanbieterdetection ohnehin Geschichte: #33

@lewurm
Copy link
Collaborator

lewurm commented Jun 2, 2024

hey @akargl, ich war mal so frei und hab eine angepasste Version gemerged. Wäre super wenn du testen könntest ob es nun für dich klappt.

@lewurm lewurm closed this Jun 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants