]> git.basschouten.com Git - openhab-addons.git/blob
a9533ad9ece57de0da998a5a55ca74405d7af022
[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
93         String group = convertPeriodToGroup(period);
94         List<MeterTelemetry> values = meter.values;
95
96         if (values != null) {
97             switch (period) {
98                 case WEEK:
99                     if (values.size() == 1) {
100                         putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0));
101                     } else if (values.size() == 2) {
102                         putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0),
103                                 values.get(1));
104                     } else {
105                         logger.warn("Response for weekly data has unexpected format, expected 2 entries got {}",
106                                 values.size());
107                     }
108                     break;
109                 case DAY:
110                 case MONTH:
111                 case YEAR:
112                     putEnergyType(valueMap, channelProvider.getChannel(group, channelId), unit, values.get(0));
113                     break;
114             }
115         }
116     }
117
118     /**
119      * calculates the self consumption coverage
120      *
121      * @param valueMap target structure
122      */
123     private final void fillSelfConsumptionCoverage(AggregatePeriod period, Map<Channel, State> valueMap) {
124         State selfConsumption = null;
125         State consumption = null;
126
127         String group = convertPeriodToGroup(period);
128
129         selfConsumption = valueMap.get(channelProvider.getChannel(group, CHANNEL_ID_SELF_CONSUMPTION_FOR_CONSUMPTION));
130         consumption = valueMap.get(channelProvider.getChannel(group, CHANNEL_ID_CONSUMPTION));
131         putPercentType(valueMap, channelProvider.getChannel(group, CHANNEL_ID_SELF_CONSUMPTION_COVERAGE),
132                 selfConsumption, consumption);
133     }
134 }