Skip to content

Commit c7d1955

Browse files
committed
commit
1 parent b13c5e7 commit c7d1955

File tree

1 file changed

+155
-2
lines changed

1 file changed

+155
-2
lines changed
Lines changed: 155 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,162 @@
11
package com.example;
22

3-
import com.example.api.ElpriserAPI;
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;
49

510
public class Main {
611
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
763
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");
8161
}
9-
}
162+
}

0 commit comments

Comments
 (0)