1- package com .example ;
2-
3- import java .time .LocalDate ;
4- import java .time .format .DateTimeFormatter ;
5- import java .time .format .DateTimeParseException ;
6- import java .util .ArrayList ;
7- import java .util .Comparator ;
8- import java .util .List ;
9-
10- public class Main {
11- public static void main (String [] args ) {
12- // hjälp
13- if (args .length > 0 && args [0 ].equals ("--help" )) {
14- skrivUtHjalp ();
15- return ;
16- }
17-
18- String zone = "SE3" ;
19- LocalDate date = LocalDate .now ();
20- LocalDate startDate = date .plusDays (1 );
21- boolean sorted = false ;
22- int chargingHours = 0 ;
23-
24- for (int i = 0 ; i < args .length ; i ++) {
25- switch (args [i ]) {
26- case "--date" :
27- if (i + 1 < args .length ) {
28- String dateArg = args [i + 1 ].toLowerCase ();
29- if (dateArg .equals ("imorgon" )) {
30- startDate = LocalDate .now ();
31- } else if (dateArg .equals ("idag" )) {
32- startDate = LocalDate .now ();
33- } else {
34- try {
35- startDate = LocalDate .parse (dateArg );
36- } catch (DateTimeParseException e ) {
37- System .out .println ("Fel: Ogiltigt datumformat. Använd YYYY-MM-DD." );
38- return ;
39- }
40- }
41- i ++;
42- }
43- break ;
44- case "--sorted" :
45- sorted = true ;
46- break ;
47- case "--charging" :
48- if (i + 1 < args .length ) {
49- String val = args [i + 1 ].replace ("h" , "" );
50- try {
51- chargingHours = Integer .parseInt (val );
52- } catch (NumberFormatException e ) {
53- System .out .println ("error: use 2h, 4h or 8h." );
54- return ;
55- }
56- i ++;
57- }
58- break ;
59- }
60- }
61-
62- // API o prisklass
63- ElpriserAPI elpriserAPI = new ElpriserAPI ();
64- ElpriserAPI .Prisklass prisklass ;
65- try {
66- prisklass = ElpriserAPI .Prisklass .valueOf (zone );
67- } catch (IllegalArgumentException e ) {
68- System .out .println ("Felaktig zon: " + zone );
69- prisklass = ElpriserAPI .Prisklass .SE3 ;
70- }
71-
72- // priser
73- List <ElpriserAPI .Elpris > priser = new ArrayList <>(elpriserAPI .getPriser (date , prisklass ));
74- if (priser .isEmpty ()) {
75- System .out .println ("inga priser tillgangliga for " + date + " in zon " + zone + "." );
76- return ;
77- }
78-
79- List <ElpriserAPI .Elpris > imorgonPriser = elpriserAPI .getPriser (startDate , prisklass );
80- if (imorgonPriser != null && !imorgonPriser .isEmpty ()) {
81- priser .addAll (imorgonPriser );
82- }
83-
84- if (sorted ) {
85- priser .sort (Comparator .comparingDouble (ElpriserAPI .Elpris ::sekPerKWh ).reversed ());
86- }
87-
88- // stats
89- DateTimeFormatter tidFormat = DateTimeFormatter .ofPattern ("HH:mm" );
90- ElpriserAPI .Elpris billigast = priser .getFirst ();
91- ElpriserAPI .Elpris dyrast = priser .getFirst ();
92- double summa = 0 ;
93-
94- // skriv ut timpriser
95- for (ElpriserAPI .Elpris pris : priser ) {
96- System .out .printf ("%s: %.4f SEK/kWh%n" ,
97- pris .timeStart ().format (tidFormat ), pris .sekPerKWh ());
98- }
99-
100- for (ElpriserAPI .Elpris pris : priser ) {
101- summa += pris .sekPerKWh ();
102- if (pris .sekPerKWh () < billigast .sekPerKWh ()) billigast = pris ;
103- if (pris .sekPerKWh () > dyrast .sekPerKWh ()) dyrast = pris ;
104- }
105-
106- double medelpris = summa / priser .size ();
107-
108- System .out .println ("Statistik" );
109- System .out .println ("Datum: " + date );
110- System .out .println ("Zon: " + zone );
111- System .out .printf ("Medelpris: %.4f SEK/kWh%n" , medelpris );
112- System .out .printf ("Billigast pris: %s - %.4f SEK/kWh%n" ,
113- billigast .timeStart ().format (tidFormat ), billigast .sekPerKWh ());
114- System .out .printf ("Dyrast pris: %s - %.4f SEK/kWh%n" ,
115- dyrast .timeStart ().format (tidFormat ), dyrast .sekPerKWh ());
116-
117- // opt laddning
118- if (chargingHours > 0 ) {
119- beraknaLaddningsfonster (priser , chargingHours , tidFormat );
120- } else {
121- // 2h, 4h, 8h
122- for (int period : new int []{2 , 4 , 8 }) {
123- beraknaLaddningsfonster (priser , period , tidFormat );
124- }
125- }
126- }
127-
128- // metod för laddningsfönster ??????????
129- public static void beraknaLaddningsfonster (List <ElpriserAPI .Elpris > priser , int timmar , DateTimeFormatter format ) {
130- if (priser .size () < timmar ) return ;
131-
132- double minSum = Double .MAX_VALUE ;
133- int minIndex = 0 ;
134-
135- for (int i = 0 ; i <= priser .size () - timmar ; i ++) {
136- double windowSum = 0 ;
137- for (int j = i ; j < i + timmar ; j ++) {
138- windowSum += priser .get (j ).sekPerKWh ();
139- }
140- if (windowSum < minSum ) {
141- minSum = windowSum ;
142- minIndex = i ;
143- }
144- }
145-
146- String startTid = priser .get (minIndex ).timeStart ().format (format );
147- String slutTid = priser .get (minIndex + timmar - 1 ).timeStart ().plusHours (1 ).format (format );
148-
149- System .out .printf ("Billigast pris %dh-period: %s - %s (%.4f SEK totalt)%n" ,
150- timmar , startTid , slutTid , minSum );
151- }
152-
153- // hjälptext
154- public static void skrivUtHjalp () {
155- System .out .println ("Usage: java -cp target/classes com.example.Main --zone <zon> [options]" );
156- System .out .println ("--zone SE1|SE2|SE3|SE4" );
157- System .out .println ("--date YYYY-MM-DD|imorgon" );
158- System .out .println ("--sorted" );
159- System .out .println ("--charging 2h|4h|8h" );
160- System .out .println ("--help" );
161- }
162- }
1+ -
0 commit comments