//---------------------------------------- FORKLARING AF DETTE SCRIPT ------------------------------------------------// // VERSION 1.0.0 // FIND DOKUMENTATION PÅ HTTPS://HOMEY.GUIDE // DETTE SCRIPT HENTER EL-PRISER UD FRA api.energidataservice.dk OG OPRETTER TAGS MED VÆRDIER OG SPEAKS, TIL BRUG I DET VIDERE FLOW. SCRIPTET UDFØRER INGEN HANDLINGER I SIG SELV. // SCRIPTET KAN BÅDE BRUGES TIL AT FÅ GENEREL INFORMATION OM EL-PRISERNE NU OG I DE KOMMENDE TIMER OG TIL AT FINDE DE BILLIGSTE X ANTAL TIMER I LØBET AF DE NÆSTE Y ANTAL TIMER. F.EKS. DE 3 BILLIGSTE TIMER TIL TØJVASK INDEN FOR DE NÆSTE 12 TIMER. // SCRIPTET TAGER IMOD 2 ARGUMENTER: ANTALTIMER, SOM ER DET ANTAL BILLIGE TIMER SOM DU SØGER, OG TIMESPAN SOM ER DEN PERIODE SOM SKAL UNDERSØGES. F.EKS. "2,12" FOR AT FINDE DE BILLIGSTE 2 TIMER I DE NÆSTE 12 TIMER. // SCRIPTET HAR EN SKÆRINGSTID PÅ 20 MINUTTER INDE I NUVÆRENDE TIME. DET BETYDER, AT KØRES SCRIPTET FØR F.EKS. KL. 14:20, SÅ UNDERSØGES DER FRA KL. 14:00 OG DERFOR KAN KL. 14:00 BLIVE DEN FØRSTE BILLIGSTE TIME - KØRES DET KL. 14.21 UNDERSØGES DER FRA KL. 15:00. // MAX TIMESPAN ER PT. 24 TIMER, MEN TÆNKER AT UDVIDDE DET, SÅ HVIS DEN FUNDNE STARTTIME ER MERE END 24 TIMER FREMME I TIDEN, SÅ FÅR DEN VÆRDIEN +100, SÅ MAN KAN SE, AT DET ER I MORGEN KL. X FREMFOR I DAG KL. X. // DET ER IKKE ALTID AT DER ER DATA TILGÆNGELIG TIL DEN ØNSKET PERIODE, I SÅFALD HENTES DER SÅ MEGET SOM DER ER. //---------------------------- HERUNDER ER KONSTANTER SOM DU SKAL KONTROLLERE/ÆNDRE ----------------------------------// const ElAfgifter = 1.09 + 0.38; // FASTE AFGIFTER INKL. MOMS, SOM LÆGGES OVEN I EL-PRISEN const PriceArea = "DK2" // DK1 = VESTDANMARK, DK2 = ØSTDANMARK const BilligPrisMinForskel = 20; // ØRE EX. MOMS - NÅR DER SØGES EFTER EN BILLIG PERIODE, SÅ SKAL DEN NÆSTE FUNDNE PERIODE MINDST VÆRE DETTE ANTAL ØRE BILLIGERE, FOR AT DEN NYE PERIODE VÆLGES I STEDET. F.EKS. HVIS 3 TIMERS PERIODEN FRA KL. 10 TIL KL. 13 KOSTER 120 ØRE + 10 ØRE + 74 ØRE, SÅ SKAL PERIODEN KL. 12 TIL 15 VÆRE DETTE ANTAL ØRE BILLIGERE, FØR DEN PERIODE VÆLGES I STEDET. //--------------------------------------------------------------------------------------------------------------------// // ------------------------------- DU SKAL IKKE ÆNDRE NOGET EFTER DENNE LINJE ----------------------------------------// //--------------------------------------------------------------------------------------------------------------------// // -------------- HVIS SCRIPT ER KALDT UDEN ARGUMENTS, SÅ INDSÆT STANDARD VÆRDIER ------------- var ArgsAntalTimer, ArgsTimespan; if(!args[0]){ ArgsAntalTimer = 6; ArgsTimespan = 24; }else{ const ArgsArray = args[0].split(","); if(ArgsArray.length != 2){throw Error("Der skal være præcist 2 arguments");} ArgsAntalTimer = parseInt(ArgsArray[0]); ArgsTimespan = parseInt(ArgsArray[1]); } // -------------- GI'R DET MENING? - FORNUFTSTJEK ------------- if(!ArgsAntalTimer || !ArgsTimespan){throw Error("Der skal indtastes 2 nummer-værdier som arguments");} if(ArgsAntalTimer > ArgsTimespan){throw Error("Timespan skal være større end antal billige timer");} if(ArgsTimespan > 24){throw Error("Timespan må max være 24 timer");} if(!ArgsAntalTimer > 0 || !ArgsTimespan > 0){throw Error("Arguments skal være større end 0");} // -- FIND PERIODEN SOM DER ØNSKES DATA FOR. DET ER FRA D.D. KL. 00:00 OG FREM TIL "NU" + TIMESPAN -- var DatoNuStartpoint = new Date(); if(DatoNuStartpoint.getMinutes() > 20){ // HVIS SCRIPT STARTES SENERE END KL. XX:20 SÅ FLYT TIMESPAN 1 TIME FREM DatoNuStartpoint = new Date(DatoNuStartpoint.setTime(DatoNuStartpoint.getTime() + 1 * 60 * 60 * 1000)); } // BRUGER ENGELSK TIDSFORMAT, FORDI DE HAR LEADING ZERO PÅ DATO OG TID, SOM DER SKAL BRUGES NÅR DER HENTES JSON DATA - var DatoNuStartpointUK = DatoNuStartpoint.toLocaleString("en-UK", { hour12: false, timeZone: (await Homey.system.getInfo()).timezone}); log("Timespan startpoint: " + DatoNuStartpointUK); // SPLITTER DATOEN fremfor .GetHours() DA LEADING ZERO ELLERS MISTES const UKdate = DatoNuStartpointUK.split(", ")[0]; let UKdateSplitted = UKdate.split("/"); const UKtime = DatoNuStartpointUK.split(", ")[1]; let UKtimeSplitted = UKtime.split(":"); var JSONDate = UKdateSplitted[2] + "-" + UKdateSplitted[1] + "-" + UKdateSplitted[0] + "T00:00"; log("JSON startpoint: " + JSONDate); var AktuelTime = parseInt(UKtimeSplitted[0]); var TimeNu = parseInt(new Date().toLocaleTimeString('da-DK', { hour12: false, timeZone: (await Homey.system.getInfo()).timezone }).split('.')[0]); var JSONLimit = AktuelTime + ArgsTimespan; if(DatoNuStartpoint.getMinutes() > 20){ if(ArgsTimespan == 24){JSONLimit = JSONLimit - 1;} // PAS PÅ IKKE AT KOMME OVER 24 TIMER. } // ----- DOWNLOAD JSON DATA FOR HELE "IDAG" + TIMESPAN ----- let Elpriser; try{ const response = await fetch('https://api.energidataservice.dk/dataset/Elspotprices?limit=' + JSONLimit + '&offset=0&start=' + JSONDate + '&filter={%22PriceArea%22:%22' + PriceArea + '%22}&sort=HourUTC%20ASC&timezone=dk'); log('Downloader fra denne JSON URL: https://api.energidataservice.dk/dataset/Elspotprices?limit=' + JSONLimit + '&offset=0&start=' + JSONDate + '&filter={%22PriceArea%22:%22' + PriceArea + '%22}&sort=HourUTC%20ASC&timezone=dk'); Elpriser = await response.json(); console.log("JSON Response status " + response.status) if(response.status != 200){throw Error("JSON Response error: " + response.status)} }catch (e){ log(e); throw Error("JSON error: " + e); } // ----- LOOP IGENNEM JSON DATA OG UDREGN VÆRDIER TIL TAGS ------ if(Elpriser.records !== undefined && Elpriser.records.length >= AktuelTime + ArgsAntalTimer){ // VARIABLER TIL DAGEN var DagensGennemsnitspris = 0, DagensBilligsteTime_KR = 9999999, DagensBilligsteTime_KL, DagensDyresteTime_KR = -10, DagensDyresteTime_KL; // VARIABLER TIL TIMESPAN var TimespanBilligst_Udregnet_KR, TimespanBilligst_Resultat_KR, TimespanBilligst_Resultat_KL,TimespanDyrest_Udregnet_KR, TimespanDyrest_Resultat_KR, TimespanDyrest_Resultat_KL, TimespanStarttid_Resultat, TimespanTotalpris_Resultat = 9999999, TimespanTotalpris_Udregnet, TimespanGennemsnitspris = 0; for(var i = 0;i < Elpriser.records.length;i++){ if(i < 24){ // OPSAMLING AF DATA SOM TILHØRER "IDAG" FRA KL 0:00 TIL 23:59 DagensGennemsnitspris = (DagensGennemsnitspris + Elpriser.records[i]["SpotPriceDKK"]); if(Elpriser.records[i]["SpotPriceDKK"] < DagensBilligsteTime_KR){ DagensBilligsteTime_KR = Elpriser.records[i]["SpotPriceDKK"]; DagensBilligsteTime_KL = new Date(Elpriser.records[i]["HourDK"]); } if(Elpriser.records[i]["SpotPriceDKK"] > DagensDyresteTime_KR){ DagensDyresteTime_KR = Elpriser.records[i]["SpotPriceDKK"]; DagensDyresteTime_KL = new Date(Elpriser.records[i]["HourDK"]); } } if(i >= AktuelTime){ // OPSAMLING AF DATA SOM TILHØRER "FRA NU" TIL ENDEN AF TIMESPAN TimespanGennemsnitspris = (TimespanGennemsnitspris + Elpriser.records[i]["SpotPriceDKK"]); // SÆTTER NOGLE DUMMY VÆRDIER, SOM BLIVER OVERSKREVET I FØRSTE GENNEMKØRSEL I "J-LOOPET" TimespanBilligst_Udregnet_KR = 999999;TimespanDyrest_Udregnet_KR = -10;TimespanTotalpris_Udregnet = 0;TimespanBilligst_Udregnet_KL = -1; TimespanDyrest_Udregnet_KL = -1; // KLOKKEN I LOOPET ER NU XX:00 - UDREGN PRISEN FOR DE NÆSTE Y ANTAL TIMER for(let j = i; ArgsAntalTimer > j - i &&i < Elpriser.records.length - ArgsAntalTimer +1;j++){ if(Elpriser.records[j]["SpotPriceDKK"] < TimespanBilligst_Udregnet_KR){ TimespanBilligst_Udregnet_KR = Elpriser.records[j]["SpotPriceDKK"]; TimespanBilligst_Udregnet_KL = new Date(Elpriser.records[j]["HourDK"]); } if(Elpriser.records[j]["SpotPriceDKK"] > TimespanDyrest_Udregnet_KR){ TimespanDyrest_Udregnet_KR = Elpriser.records[j]["SpotPriceDKK"]; TimespanDyrest_Udregnet_KL = new Date(Elpriser.records[j]["HourDK"]); } TimespanTotalpris_Udregnet = TimespanTotalpris_Udregnet + Elpriser.records[j]["SpotPriceDKK"]; } // UNDERSØG OM DEN UDREGNET PRIS I J-LOOPET VAR BEDRE END TIDLIGERE UDREGNET if(TimespanTotalpris_Udregnet < TimespanTotalpris_Resultat - (BilligPrisMinForskel * 10) && TimespanTotalpris_Udregnet != 0){ // DER SKAL VÆRE MINDST XXX ØRES FORSKEL PÅ RÅPRIS/EX. MOMS, FØR DER VÆLGES EN SENERE TID TimespanBilligst_Resultat_KR = TimespanBilligst_Udregnet_KR; TimespanDyrest_Resultat_KR = TimespanDyrest_Udregnet_KR; TimespanTotalpris_Resultat = TimespanTotalpris_Udregnet; TimespanStarttid_Resultat = Elpriser.records[i]["HourDK"]; TimespanBilligst_Resultat_KL = TimespanBilligst_Udregnet_KL; TimespanDyrest_Resultat_KL = TimespanDyrest_Udregnet_KL; } } } // ---------- BEREGN DATA SOM IKKE KAN BEREGNES I LOOP'ET --------------- // DATA FOR DAGEN DagensGennemsnitspris = DagensGennemsnitspris / 24; var DagensGennemsnitspris_kontra_pris_nu = (((Elpriser.records[TimeNu]["SpotPriceDKK"] - DagensGennemsnitspris) * 1.25) / 10).toFixed(0); // ØNSKER RESULTAT I HELE ØRE OG IKKE KRONER var DagensGennemsnitspris_uden_momsafgifter = DagensGennemsnitspris; DagensGennemsnitspris = add_moms_og_afgifter(DagensGennemsnitspris / 1000); DagensBilligsteTime_KR = add_moms_og_afgifter(DagensBilligsteTime_KR / 1000); DagensDyresteTime_KR = add_moms_og_afgifter(DagensDyresteTime_KR / 1000); var PrisLigeNu = add_moms_og_afgifter(Elpriser.records[TimeNu]["SpotPriceDKK"] / 1000); // DATA FOR TIMESPAN TimespanGennemsnitspris = TimespanGennemsnitspris / (Elpriser.records.length - AktuelTime); var TimespanGennemsnitspris_kontra_pris_nu = (((Elpriser.records[TimeNu]["SpotPriceDKK"] - TimespanGennemsnitspris) * 1.25) / 10).toFixed(0); // ØNSKER RESULTAT I HELE ØRE OG IKKE KRONER TimespanGennemsnitspris = add_moms_og_afgifter(TimespanGennemsnitspris / 1000); TimespanStarttid_Resultat = new Date(TimespanStarttid_Resultat).getHours(); TimespanBilligst_Resultat_KR = add_moms_og_afgifter(TimespanBilligst_Resultat_KR / 1000); TimespanDyrest_Resultat_KR = add_moms_og_afgifter(TimespanDyrest_Resultat_KR / 1000); TimespanTotalpris_Resultat = ((TimespanTotalpris_Resultat / 1000) * 1.25) + (ArgsAntalTimer * ElAfgifter); // BRUGER IKKE ADD_MOMS_OG_AFGIFTER DA DEN IKKE LÆGGER AFGIFTER TIL PR. TIME // ------ LOOP JSON DATA IGENNEM IGEN FOR AT FINDE DATA TIL SPEAK - START LOOP FRA "NU" ------------ var Dagens_NaesteGangStroemmenBillig_KL, Dagens_NaesteGangStroemmenBillig_KR, Dagens_NaesteGangStroemmenAllerBillig_KR = 9999999, Dagens_NaesteGangStroemmenAllerBillig_KL, Dagens_StroemmenBilligTil_KL; for(var i = AktuelTime;i < Elpriser.records.length;i++){ // --- DATA TIL DAGENS SPEAK START --- if(Elpriser.records[i]["SpotPriceDKK"] > DagensGennemsnitspris_uden_momsafgifter && !Dagens_StroemmenBilligTil_KL){ Dagens_StroemmenBilligTil_KL = new Date(Elpriser.records[i]["HourDK"]); } if(Elpriser.records[i]["SpotPriceDKK"] < DagensGennemsnitspris_uden_momsafgifter && !Dagens_NaesteGangStroemmenBillig_KL){ Dagens_NaesteGangStroemmenBillig_KR = Elpriser.records[i]["SpotPriceDKK"]; Dagens_NaesteGangStroemmenBillig_KL = new Date(Elpriser.records[i]["HourDK"]); } if(Elpriser.records[i]["SpotPriceDKK"] + 20 < Dagens_NaesteGangStroemmenAllerBillig_KR && Dagens_NaesteGangStroemmenBillig_KL){ Dagens_NaesteGangStroemmenAllerBillig_KR = Elpriser.records[i]["SpotPriceDKK"]; Dagens_NaesteGangStroemmenAllerBillig_KL = new Date(Elpriser.records[i]["HourDK"]); } } // ------- BEREGN DATA FUNDET I DET EKSTRA LOOP ---------- Dagens_NaesteGangStroemmenAllerBillig_KR = add_moms_og_afgifter(Dagens_NaesteGangStroemmenAllerBillig_KR / 1000); // -------------- GENERÉR SPEAK FOR DAGEN ---------------------- let Speak_GenerelRapport = "Strømmen koster lige nu " + PrisLigeNu.split(".")[0] + " kroner og " + PrisLigeNu.split(".")[1] + " øre, og er "; if(DagensGennemsnitspris_kontra_pris_nu < 0){ // Billigere end gennemsnit DEL 1 Speak_GenerelRapport += (DagensGennemsnitspris_kontra_pris_nu).replace("-","") + " øre billigere"; }else{ Speak_GenerelRapport += (DagensGennemsnitspris_kontra_pris_nu).replace("-","") + " øre dyrere"; } Speak_GenerelRapport += " end dagens gennemsnit på " + DagensGennemsnitspris.split(".")[0] + " kroner og " + parseInt(DagensGennemsnitspris.split(".")[1]) + " øre."; Speak_GenerelRapport += " Dagens priser varierer fra " + DagensBilligsteTime_KR.split(".")[0] + " kroner og " + DagensBilligsteTime_KR.split(".")[1] + " øre til " + DagensDyresteTime_KR.split(".")[0] + " kroner og " + parseInt(DagensDyresteTime_KR.split(".")[1]) + " øre."; if(DagensGennemsnitspris_kontra_pris_nu < 0){ // Billigere end gennemsnit DEL 2 if(Dagens_StroemmenBilligTil_KL){ Speak_GenerelRapport += " Strømmen er billig til kl. " + Dagens_StroemmenBilligTil_KL.getHours() + "."; }else{ Speak_GenerelRapport += " Strømmen bliver ikke dyr de næste " + ArgsTimespan + " timer."; } }else{ if(Dagens_NaesteGangStroemmenBillig_KL){ // Strømmen kommer under dagensgennemsnit Speak_GenerelRapport += " Strømmen bliver billigere end gennemsnittet kl. " + Dagens_NaesteGangStroemmenBillig_KL.getHours() if(Dagens_NaesteGangStroemmenAllerBillig_KL && Dagens_NaesteGangStroemmenAllerBillig_KL.getHours() != Dagens_NaesteGangStroemmenBillig_KL.getHours()){ Speak_GenerelRapport += ", men er allerbilligst kl. " + Dagens_NaesteGangStroemmenAllerBillig_KL.getHours() + ", hvor den koster " + Dagens_NaesteGangStroemmenAllerBillig_KR.split(".")[0] + " kroner og " + parseInt(Dagens_NaesteGangStroemmenAllerBillig_KR.split(".")[1]) + " øre."; } } else { Speak_GenerelRapport += "Strømmen bliver ikke billig i løbet af de næste " + ArgsTimespan + " timer"; } } log('------------------------------------------------------'); log(Speak_GenerelRapport); // -------------- GENERÉR SPEAK FOR PERIODEN ---------------------- let Speak_FundneTimerRapport = "Jeg har undersøgt de næste " + (Elpriser.records.length - TimeNu) + " timer og fundet de billigste " + ArgsAntalTimer + " timer. Tiden starter kl. " + TimespanStarttid_Resultat + " og har en pris mellem " + TimespanBilligst_Resultat_KR.split(".")[0] + " kroner og " + parseInt(TimespanBilligst_Resultat_KR.split(".")[1]) + " øre, og " + TimespanDyrest_Resultat_KR.split(".")[0] + " kroner og " + TimespanDyrest_Resultat_KR.split(".")[1] + " øre. Strømmen koster lige nu " + PrisLigeNu.split(".")[0] + " kroner og " + parseInt(PrisLigeNu.split(".")[1]) + " øre, og er "; if(TimespanGennemsnitspris_kontra_pris_nu < 0){ // Billigere end gennemsnit Speak_FundneTimerRapport += (TimespanGennemsnitspris_kontra_pris_nu).replace("-", "") + " øre billigere"; }else{ Speak_FundneTimerRapport += (TimespanGennemsnitspris_kontra_pris_nu).replace("-", "") + " øre dyrere"; } Speak_FundneTimerRapport += " end periodens gennemsnit på " + TimespanGennemsnitspris.split(".")[0] + " kroner og " + parseInt(TimespanGennemsnitspris.split(".")[1]) + " øre."; log('------------------------------------------------------'); log(Speak_FundneTimerRapport); // -------------- GENERÉR TAGS FOR FUNDNE VÆRDIER --------------- await tag("ELpris_Opdateret_KL", new Date().toLocaleString('da-DK', { hour12: false, timeZone: (await Homey.system.getInfo()).timezone })); await tag("ELpris_Dagen_Pris_Nu_KR", Number(PrisLigeNu)); await tag("ELpris_Dagen_Gennemsnitspris_KR", Number(DagensGennemsnitspris)); if(Dagens_StroemmenBilligTil_KL){ await tag("ELpris_Dagen_StromBilligTil_KL", Number(Dagens_StroemmenBilligTil_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0]));; }else{ await tag("ELpris_Dagen_StromBilligTil_KL", Number(-1)); } if(Dagens_NaesteGangStroemmenBillig_KL){ await tag("ELpris_Dagen_StromBilligNext_KL", Number(Dagens_NaesteGangStroemmenBillig_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0]));; }else{ await tag("ELpris_Dagen_StromBilligNext_KL", Number(-1)); } await tag("ELpris_Dagen_StromBilligNext_KR", Number(add_moms_og_afgifter(Dagens_NaesteGangStroemmenBillig_KR / 1000))); if(Dagens_NaesteGangStroemmenAllerBillig_KL){ await tag("ELpris_Dagen_StromBilligAllerBilligstNext_KL", Number(Dagens_NaesteGangStroemmenAllerBillig_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0])); }else{ await tag("ELpris_Dagen_StromBilligAllerBilligstNext_KL", Number(-1)); } await tag("ELpris_Dagen_StromBilligAllerBilligstNext_KR", Number(Dagens_NaesteGangStroemmenAllerBillig_KR)); if(DagensDyresteTime_KL){ await tag("ELpris_Dagen_DyresteTime_KL", Number(DagensDyresteTime_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0])); }else{ await tag("ELpris_Dagen_DyresteTime_KL", Number(-1)); } await tag("ELpris_Dagen_DyresteTime_KR", Number(DagensDyresteTime_KR)); if(DagensBilligsteTime_KL){ await tag("ELpris_Dagen_BilligsteTime_KL", Number(DagensBilligsteTime_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0])); }else{ await tag("ELpris_Dagen_BilligsteTime_KL", Number(-1)); } await tag("ELpris_Dagen_BilligsteTime_KR", Number(DagensBilligsteTime_KR)); await tag("ELpris_Periode_Undersoegt_TIMER", Number((Elpriser.records.length - AktuelTime))); await tag("ELpris_Periode_Start_KL", Number(TimespanStarttid_Resultat)); await tag("ELpris_Periode_Laengde_TIMER", Number(ArgsAntalTimer)); await tag("ELpris_Periode_Billigste_Time_KL", Number(TimespanBilligst_Resultat_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0])); await tag("ELpris_Periode_Billigste_Time_KR", Number(TimespanBilligst_Resultat_KR)); await tag("ELpris_Periode_Dyreste_Time_KL", Number(TimespanDyrest_Resultat_KL.toLocaleTimeString('da-DK', { hour12: false}).split(".")[0])); await tag("ELpris_Periode_Dyreste_Time_KR", Number(TimespanDyrest_Resultat_KR)); await tag("ELpris_Periode_Billigste_Timer_Gennemsnitspris_KR", Number((TimespanTotalpris_Resultat / ArgsAntalTimer).toFixed(2))); // GENNEMSNITSPRIS FOR DEN PERIODE SOM ER VALGT SOM DEN BILLIGSTE await tag("ELpris_Periode_Gennemsnitspris_KR", Number(TimespanGennemsnitspris)); // GENNEMSNITSPRIS FOR HELE DEN UNDERSØGTE PERIODE. ALTSÅ FRA "NU" OG X ANTAL TIMER FREM. await tag("ELpris_Speak_GenerelRapport", Speak_GenerelRapport); await tag("ELpris_Speak_FundneTimerRapport", Speak_FundneTimerRapport); }else{ throw Error("Ikke nok JSON data, til at undersøge priserne " + ArgsTimespan + " frem. Der er kun " + (Elpriser.records.length - AktuelTime) + " timer fra datakilden."); } // --------- FUNKTIONER SOM BRUGES OPPE I SCRIPTET ----------- function add_moms_og_afgifter($brutto){ return((($brutto * 1.25) + ElAfgifter).toFixed(2)); }