2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.solaredge.internal.model;
15 import static org.openhab.binding.solaredge.internal.SolarEdgeBindingConstants.*;
17 import java.util.HashMap;
18 import java.util.List;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.openhab.binding.solaredge.internal.handler.ChannelProvider;
23 import org.openhab.binding.solaredge.internal.model.AggregateDataResponsePublicApi.EnergyDetails;
24 import org.openhab.binding.solaredge.internal.model.AggregateDataResponsePublicApi.MeterTelemetries;
25 import org.openhab.binding.solaredge.internal.model.AggregateDataResponsePublicApi.MeterTelemetry;
26 import org.openhab.core.thing.Channel;
27 import org.openhab.core.types.State;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
32 * transforms the http response into the openhab datamodel (instances of State)
34 * @author Alexander Friese - initial contribution
37 public class AggregateDataResponseTransformerPublicApi extends AbstractDataResponseTransformer {
38 private final Logger logger = LoggerFactory.getLogger(AggregateDataResponseTransformerPublicApi.class);
40 private static final String METER_TYPE_PRODUCTION = "Production";
41 private static final String METER_TYPE_CONSUMPTION = "Consumption";
42 private static final String METER_TYPE_SELFCONSUMPTION = "SelfConsumption";
43 private static final String METER_TYPE_IMPORT = "Purchased";
44 private static final String METER_TYPE_EXPORT = "FeedIn";
46 private final ChannelProvider channelProvider;
48 public AggregateDataResponseTransformerPublicApi(ChannelProvider channelProvider) {
49 this.channelProvider = channelProvider;
52 public Map<Channel, State> transform(AggregateDataResponsePublicApi response, AggregatePeriod period) {
53 Map<Channel, State> result = new HashMap<>(20);
54 EnergyDetails energyDetails = response.getEnergyDetails();
56 if (energyDetails != null) {
57 AggregatePeriod timeUnit = energyDetails.timeUnit;
58 String unit = energyDetails.unit;
59 if (timeUnit != null && unit != null && energyDetails.meters != null) {
60 for (MeterTelemetries meter : energyDetails.meters) {
61 String type = meter.type;
63 if (type.equals(METER_TYPE_PRODUCTION)) {
64 fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_PRODUCTION, result);
65 } else if (type.equals(METER_TYPE_CONSUMPTION)) {
66 fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_CONSUMPTION, result);
67 } else if (type.equals(METER_TYPE_SELFCONSUMPTION)) {
68 fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_SELF_CONSUMPTION_FOR_CONSUMPTION,
70 } else if (type.equals(METER_TYPE_IMPORT)) {
71 fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_IMPORT, result);
72 } else if (type.equals(METER_TYPE_EXPORT)) {
73 fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_EXPORT, result);
77 fillSelfConsumptionCoverage(timeUnit, result);
84 * copies production data to the result map
86 * @param meter meter raw data
87 * @param valueMap target structure
89 private final void fillAggregateData(AggregatePeriod period, String unit, MeterTelemetries meter, String channelId,
90 Map<Channel, State> valueMap) {
92 String group = convertPeriodToGroup(period);
93 List<MeterTelemetry> values = meter.values;
98 if (values.size() == 1) {
99 putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0));
100 } else if (values.size() == 2) {
101 putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0),
104 logger.warn("Response for weekly data has unexpected format, expected 2 entries got {}",
111 putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0));
118 * calculates the self consumption coverage
120 * @param valueMap target structure
122 private final void fillSelfConsumptionCoverage(AggregatePeriod period, Map<Channel, State> valueMap) {
123 State selfConsumption = null;
124 State consumption = null;
126 String group = convertPeriodToGroup(period);
128 selfConsumption = valueMap.get(channelProvider.getChannel(group, CHANNEL_ID_SELF_CONSUMPTION_FOR_CONSUMPTION));
129 consumption = valueMap.get(channelProvider.getChannel(group, CHANNEL_ID_CONSUMPTION));
130 putPercentType(valueMap, channelProvider.getChannel(group, CHANNEL_ID_SELF_CONSUMPTION_COVERAGE),
131 selfConsumption, consumption);