Skip to content

Commit d918c20

Browse files
authored
Define grid tariff filters in YAML (openhab#17690)
Signed-off-by: Jacob Laursen <[email protected]>
1 parent a32ac52 commit d918c20

File tree

11 files changed

+613
-195
lines changed

11 files changed

+613
-195
lines changed

bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/api/DatahubTariffFilterFactory.java

-186
This file was deleted.

bundles/org.openhab.binding.energidataservice/src/main/java/org/openhab/binding/energidataservice/internal/api/DateQueryParameterType.java

+9
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,13 @@ public enum DateQueryParameterType {
3737
public String toString() {
3838
return name;
3939
}
40+
41+
public static DateQueryParameterType of(String name) {
42+
for (DateQueryParameterType type : values()) {
43+
if (type.name.equals(name)) {
44+
return type;
45+
}
46+
}
47+
throw new IllegalArgumentException("Unknown date query parameter: " + name);
48+
}
4049
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/**
2+
* Copyright (c) 2010-2024 Contributors to the openHAB project
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Eclipse Public License 2.0 which is available at
9+
* http://www.eclipse.org/legal/epl-2.0
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
package org.openhab.binding.energidataservice.internal.api.filter;
14+
15+
import static org.openhab.binding.energidataservice.internal.EnergiDataServiceBindingConstants.*;
16+
17+
import java.io.IOException;
18+
import java.io.InputStream;
19+
import java.time.LocalDate;
20+
import java.util.Collection;
21+
import java.util.HashMap;
22+
import java.util.List;
23+
import java.util.Map;
24+
import java.util.Set;
25+
26+
import org.eclipse.jdt.annotation.NonNullByDefault;
27+
import org.openhab.binding.energidataservice.internal.api.DatahubTariffFilter;
28+
import org.openhab.binding.energidataservice.internal.api.DateQueryParameter;
29+
import org.openhab.binding.energidataservice.internal.api.DateQueryParameterType;
30+
import org.openhab.binding.energidataservice.internal.api.filter.dto.DatahubFilter;
31+
import org.slf4j.Logger;
32+
import org.slf4j.LoggerFactory;
33+
34+
import com.fasterxml.jackson.databind.ObjectMapper;
35+
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
36+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
37+
38+
/**
39+
* Factory for creating a {@link DatahubTariffFilter} for a specific Grid Company GLN.
40+
*
41+
* @author Jacob Laursen - Initial contribution
42+
*/
43+
@NonNullByDefault
44+
public class DatahubTariffFilterFactory {
45+
46+
private static final String RESOURCE_NAME = "/filters/grid_tariffs.yaml";
47+
48+
private static final String NOTE_NET_TARIFF_C = "Nettarif C";
49+
private static final String NOTE_SYSTEM_TARIFF = "Systemtarif";
50+
private static final String NOTE_ELECTRICITY_TAX = "Elafgift";
51+
private static final String NOTE_REDUCED_ELECTRICITY_TAX = "Reduceret elafgift";
52+
private static final String NOTE_TRANSMISSION_NET_TARIFF = "Transmissions nettarif";
53+
54+
private final Logger logger = LoggerFactory.getLogger(DatahubTariffFilterFactory.class);
55+
56+
private final Map<String, DatahubFilter> filterMap = getMap();
57+
58+
private Map<String, DatahubFilter> getMap() {
59+
HashMap<String, DatahubFilter> filterMap = new HashMap<>();
60+
Collection<DatahubFilter> filters = parseResource();
61+
for (DatahubFilter filter : filters) {
62+
filterMap.put(filter.gln(), filter);
63+
}
64+
return filterMap;
65+
}
66+
67+
private Collection<DatahubFilter> parseResource() {
68+
try (InputStream inputStream = DatahubTariffFilterFactory.class.getResourceAsStream(RESOURCE_NAME)) {
69+
if (inputStream == null) {
70+
throw new IllegalStateException("Grid tariffs resource not found");
71+
}
72+
73+
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
74+
mapper.registerModule(new JavaTimeModule());
75+
76+
return mapper.readValue(inputStream,
77+
mapper.getTypeFactory().constructCollectionType(List.class, DatahubFilter.class));
78+
} catch (IOException e) {
79+
throw new IllegalStateException("Grid tariffs resource could not be read and parsed", e);
80+
}
81+
}
82+
83+
public DatahubTariffFilter getGridTariffByGLN(String globalLocationNumber) {
84+
DatahubFilter datahubFilter = filterMap.get(globalLocationNumber);
85+
if (datahubFilter != null) {
86+
logger.trace("Found filter in YAML resource: {}", datahubFilter);
87+
return new DatahubTariffFilter(datahubFilter.chargeTypeCodes(), datahubFilter.notes(),
88+
datahubFilter.start());
89+
}
90+
return new DatahubTariffFilter(Set.of(), Set.of(NOTE_NET_TARIFF_C),
91+
DateQueryParameter.of(DateQueryParameterType.START_OF_YEAR));
92+
}
93+
94+
public static DatahubTariffFilter getSystemTariff() {
95+
return new DatahubTariffFilter(Set.of(), Set.of(NOTE_SYSTEM_TARIFF),
96+
DateQueryParameter.of(ENERGINET_CUTOFF_DATE));
97+
}
98+
99+
public static DatahubTariffFilter getTransmissionGridTariff() {
100+
return new DatahubTariffFilter(Set.of(), Set.of(NOTE_TRANSMISSION_NET_TARIFF),
101+
DateQueryParameter.of(ENERGINET_CUTOFF_DATE));
102+
}
103+
104+
public static DatahubTariffFilter getElectricityTax() {
105+
return new DatahubTariffFilter(Set.of(), Set.of(NOTE_ELECTRICITY_TAX),
106+
DateQueryParameter.of(ENERGINET_CUTOFF_DATE));
107+
}
108+
109+
public static DatahubTariffFilter getReducedElectricityTax() {
110+
return new DatahubTariffFilter(Set.of(), Set.of(NOTE_REDUCED_ELECTRICITY_TAX),
111+
DateQueryParameter.of(LocalDate.of(2021, 2, 1)));
112+
}
113+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* Copyright (c) 2010-2024 Contributors to the openHAB project
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Eclipse Public License 2.0 which is available at
9+
* http://www.eclipse.org/legal/epl-2.0
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
package org.openhab.binding.energidataservice.internal.api.filter.dto;
14+
15+
import java.util.Objects;
16+
import java.util.Set;
17+
18+
import org.eclipse.jdt.annotation.NonNullByDefault;
19+
import org.openhab.binding.energidataservice.internal.api.ChargeTypeCode;
20+
import org.openhab.binding.energidataservice.internal.api.DateQueryParameter;
21+
import org.openhab.binding.energidataservice.internal.api.filter.serialization.ChargeTypeCodeDeserializer;
22+
import org.openhab.binding.energidataservice.internal.api.filter.serialization.DateQueryParameterDeserializer;
23+
24+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
25+
26+
/**
27+
* Record for deserializing YAML grid tariff definitions.
28+
*
29+
* @author Jacob Laursen - Initial contribution
30+
*/
31+
@NonNullByDefault
32+
public record DatahubFilter(String gln,
33+
@JsonDeserialize(contentUsing = ChargeTypeCodeDeserializer.class) Set<ChargeTypeCode> chargeTypeCodes,
34+
Set<String> notes, @JsonDeserialize(using = DateQueryParameterDeserializer.class) DateQueryParameter start) {
35+
@Override
36+
public DateQueryParameter start() {
37+
return Objects.isNull(start) ? DateQueryParameter.EMPTY : start;
38+
}
39+
40+
@Override
41+
public Set<String> notes() {
42+
return Objects.isNull(notes) ? Set.of() : notes;
43+
}
44+
45+
@Override
46+
public String toString() {
47+
return "DatahubFilter{gln='" + gln + "', chargeTypeCodes=" + chargeTypeCodes + "', notes=" + notes + "', start="
48+
+ start + '}';
49+
}
50+
}

0 commit comments

Comments
 (0)