]> git.basschouten.com Git - openhab-addons.git/blob
d11209f52f489ceb15fd98841fb5bcc44ad57361
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.solaredge.internal.model;
14
15 import static org.openhab.binding.solaredge.internal.SolarEdgeBindingConstants.*;
16
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20
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;
30
31 /**
32  * transforms the http response into the openhab datamodel (instances of State)
33  *
34  * @author Alexander Friese - initial contribution
35  */
36 @NonNullByDefault
37 public class AggregateDataResponseTransformerPublicApi extends AbstractDataResponseTransformer {
38     private final Logger logger = LoggerFactory.getLogger(AggregateDataResponseTransformerPublicApi.class);
39
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";
45
46     private final ChannelProvider channelProvider;
47
48     public AggregateDataResponseTransformerPublicApi(ChannelProvider channelProvider) {
49         this.channelProvider = channelProvider;
50     }
51
52     public Map<Channel, State> transform(AggregateDataResponsePublicApi response, AggregatePeriod period) {
53         Map<Channel, State> result = new HashMap<>(20);
54         EnergyDetails energyDetails = response.getEnergyDetails();
55
56         if (energyDetails != null) {
57             AggregatePeriod timeUnit = energyDetails.timeUnit;
58             String unit = energyDetails.unit;
59             List<MeterTelemetries> meters = energyDetails.meters;
60             if (timeUnit != null && unit != null && meters != null) {
61                 for (MeterTelemetries meter : meters) {
62                     String type = meter.type;
63                     if (type != null) {
64                         if (type.equals(METER_TYPE_PRODUCTION)) {
65                             fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_PRODUCTION, result);
66                         } else if (type.equals(METER_TYPE_CONSUMPTION)) {
67                             fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_CONSUMPTION, result);
68                         } else if (type.equals(METER_TYPE_SELFCONSUMPTION)) {
69                             fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_SELF_CONSUMPTION_FOR_CONSUMPTION,
70                                     result);
71                         } else if (type.equals(METER_TYPE_IMPORT)) {
72                             fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_IMPORT, result);
73                         } else if (type.equals(METER_TYPE_EXPORT)) {
74                             fillAggregateData(timeUnit, unit, meter, CHANNEL_ID_EXPORT, result);
75                         }
76                     }
77                 }
78                 fillSelfConsumptionCoverage(timeUnit, result);
79             }
80         }
81         return result;
82     }
83
84     /**
85      * copies production data to the result map
86      *
87      * @param meter meter raw data
88      * @param valueMap target structure
89      */
90     private final void fillAggregateData(AggregatePeriod period, String unit, MeterTelemetries meter, String channelId,
91             Map<Channel, State> valueMap) {
92         String group = convertPeriodToGroup(period);
93         List<MeterTelemetry> values = meter.values;
94
95         if (values != null) {
96             switch (period) {
97                 case WEEK:
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),
102                                 values.get(1));
103                     } else {
104                         logger.warn("Response for weekly data has unexpected format, expected 2 entries got {}",
105                                 values.size());
106                     }
107                     break;
108                 case DAY:
109                 case MONTH:
110                 case YEAR:
111                     putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0));
112                     break;
113             }
114         }
115     }
116
117     /**
118      * calculates the self consumption coverage
119      *
120      * @param valueMap target structure
121      */
122     private final void fillSelfConsumptionCoverage(AggregatePeriod period, Map<Channel, State> valueMap) {
123         State selfConsumption = null;
124         State consumption = null;
125
126         String group = convertPeriodToGroup(period);
127
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);
132     }
133 }