]> git.basschouten.com Git - openhab-addons.git/blob
3d61b8a39a46727faf86f0926e1e477ae85014a2
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 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.kostalinverter.internal.thirdgeneration;
14
15 import static org.openhab.binding.kostalinverter.internal.thirdgeneration.ThirdGenerationBindingConstants.*;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.HashMap;
20 import java.util.List;
21 import java.util.Map;
22 import java.util.stream.Collectors;
23 import java.util.stream.Stream;
24
25 /**
26  * The {@link ThirdGenerationMappingInverterToChannel} is responsible for the management of the channels
27  * available to inverters
28  *
29  * @author RenĂ© Stakemeier - Initial contribution
30  */
31 class ThirdGenerationMappingInverterToChannel {
32
33     private static final Map<ThirdGenerationInverterTypes, List<ThirdGenerationChannelMappingToWebApi>> CHANNEL_MAPPING = new HashMap<>();
34
35     /*
36      * Assign the channels to the devices.
37      */
38     static {
39         List<ThirdGenerationInverterTypes> allInvertersList = Arrays.asList(ThirdGenerationInverterTypes.values());
40         List<ThirdGenerationInverterTypes> allBatteryInvertersList = Stream
41                 .of(ThirdGenerationInverterTypes.PLENTICORE_PLUS_42_WITH_BATTERY,
42                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_55_WITH_BATTERY,
43                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_70_WITH_BATTERY,
44                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_85_WITH_BATTERY,
45                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_100_WITH_BATTERY)
46                 .collect(Collectors.toList());
47         List<ThirdGenerationInverterTypes> allInvertersWithThreeStringsList = Stream
48                 .of(ThirdGenerationInverterTypes.PLENTICORE_PLUS_42_WITHOUT_BATTERY,
49                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_55_WITHOUT_BATTERY,
50                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_70_WITHOUT_BATTERY,
51                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_85_WITHOUT_BATTERY,
52                         ThirdGenerationInverterTypes.PLENTICORE_PLUS_100_WITHOUT_BATTERY)
53                 .collect(Collectors.toList());
54
55         // Channels available on all devices
56         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_DC_POWER, "devices:local", "Dc_P",
57                 ThirdGenerationChannelDatatypes.WATT);
58         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_HOMECONSUMPTION_FROM_GRID, "devices:local",
59                 "HomeGrid_P", ThirdGenerationChannelDatatypes.WATT);
60         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_OWNCONSUMPTION, "devices:local", "HomeOwn_P",
61                 ThirdGenerationChannelDatatypes.WATT);
62         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_HOMECONSUMPTION_FROM_PV, "devices:local", "HomePv_P",
63                 ThirdGenerationChannelDatatypes.WATT);
64         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_HOMECONSUMPTION_TOTAL, "devices:local", "Home_P",
65                 ThirdGenerationChannelDatatypes.WATT);
66         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_LIMIT_EVU_ABSOLUTE, "devices:local", "LimitEvuAbs",
67                 ThirdGenerationChannelDatatypes.WATT);
68         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_LIMIT_EVU_RELATIV, "devices:local", "LimitEvuRel",
69                 ThirdGenerationChannelDatatypes.PERCEMTAGE);
70         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_WORKTIME, "devices:local", "WorkTime",
71                 ThirdGenerationChannelDatatypes.SECONDS);
72         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_1_CURRENT_AMPERAGE, "devices:local:ac",
73                 "L1_I", ThirdGenerationChannelDatatypes.AMPERE);
74         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_1_CURRENT_POWER, "devices:local:ac", "L1_P",
75                 ThirdGenerationChannelDatatypes.WATT);
76         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_1_CURRENT_VOLTAGE, "devices:local:ac",
77                 "L1_U", ThirdGenerationChannelDatatypes.VOLT);
78         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_2_CURRENT_AMPERAGE, "devices:local:ac",
79                 "L2_I", ThirdGenerationChannelDatatypes.AMPERE);
80         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_2_CURRENT_POWER, "devices:local:ac", "L2_P",
81                 ThirdGenerationChannelDatatypes.WATT);
82         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_2_CURRENT_VOLTAGE, "devices:local:ac",
83                 "L2_U", ThirdGenerationChannelDatatypes.VOLT);
84         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_3_CURRENT_AMPERAGE, "devices:local:ac",
85                 "L3_I", ThirdGenerationChannelDatatypes.AMPERE);
86         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_3_CURRENT_POWER, "devices:local:ac", "L3_P",
87                 ThirdGenerationChannelDatatypes.WATT);
88         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_3_CURRENT_VOLTAGE, "devices:local:ac",
89                 "L3_U", ThirdGenerationChannelDatatypes.VOLT);
90         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_CURRENT_POWER, "devices:local:ac", "P",
91                 ThirdGenerationChannelDatatypes.WATT);
92         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_1_AMPERAGE, "devices:local:pv1", "I",
93                 ThirdGenerationChannelDatatypes.AMPERE);
94         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_1_POWER, "devices:local:pv1", "P",
95                 ThirdGenerationChannelDatatypes.WATT);
96         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_1_VOLTAGE, "devices:local:pv1", "U",
97                 ThirdGenerationChannelDatatypes.VOLT);
98         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_2_AMPERAGE, "devices:local:pv2", "I",
99                 ThirdGenerationChannelDatatypes.AMPERE);
100         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_2_POWER, "devices:local:pv2", "P",
101                 ThirdGenerationChannelDatatypes.WATT);
102         addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_2_VOLTAGE, "devices:local:pv2", "U",
103                 ThirdGenerationChannelDatatypes.VOLT);
104         addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_ERROR_COUNT_MC, "scb:event", "ErrMc",
105                 ThirdGenerationChannelDatatypes.INTEGER);
106         addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_ERROR_COUNT_SFH, "scb:event", "ErrSFH",
107                 ThirdGenerationChannelDatatypes.INTEGER);
108         addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_ERROR_COUNT_SCB, "scb:event", "Event:ActiveErrorCnt",
109                 ThirdGenerationChannelDatatypes.INTEGER);
110         addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_WARNING_COUNT_SCB, "scb:event", "Event:ActiveWarningCnt",
111                 ThirdGenerationChannelDatatypes.INTEGER);
112         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_DAY, "scb:statistic:EnergyFlow",
113                 "Statistic:Autarky:Day", ThirdGenerationChannelDatatypes.PERCEMTAGE);
114         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_MONTH, "scb:statistic:EnergyFlow",
115                 "Statistic:Autarky:Month", ThirdGenerationChannelDatatypes.PERCEMTAGE);
116         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_TOTAL, "scb:statistic:EnergyFlow",
117                 "Statistic:Autarky:Total", ThirdGenerationChannelDatatypes.PERCEMTAGE);
118         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_YEAR, "scb:statistic:EnergyFlow",
119                 "Statistic:Autarky:Year", ThirdGenerationChannelDatatypes.PERCEMTAGE);
120         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_DAY, "scb:statistic:EnergyFlow",
121                 "Statistic:CO2Saving:Day", ThirdGenerationChannelDatatypes.KILOGRAM);
122         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_MONTH, "scb:statistic:EnergyFlow",
123                 "Statistic:CO2Saving:Month", ThirdGenerationChannelDatatypes.KILOGRAM);
124         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_TOTAL, "scb:statistic:EnergyFlow",
125                 "Statistic:CO2Saving:Total", ThirdGenerationChannelDatatypes.KILOGRAM);
126         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_YEAR, "scb:statistic:EnergyFlow",
127                 "Statistic:CO2Saving:Year", ThirdGenerationChannelDatatypes.KILOGRAM);
128         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_DAY, "scb:statistic:EnergyFlow",
129                 "Statistic:EnergyHome:Day", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
130         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_MONTH, "scb:statistic:EnergyFlow",
131                 "Statistic:EnergyHome:Month", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
132         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_TOTAL, "scb:statistic:EnergyFlow",
133                 "Statistic:EnergyHome:Total", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
134         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_YEAR, "scb:statistic:EnergyFlow",
135                 "Statistic:EnergyHome:Year", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
136         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_DAY,
137                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Day",
138                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
139         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_MONTH,
140                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Month",
141                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
142         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_TOTAL,
143                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Total",
144                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
145         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_YEAR,
146                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Year",
147                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
148         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_DAY, "scb:statistic:EnergyFlow",
149                 "Statistic:EnergyHomePv:Day", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
150         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_MONTH,
151                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomePv:Month",
152                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
153         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_TOTAL,
154                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomePv:Total",
155                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
156         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_YEAR, "scb:statistic:EnergyFlow",
157                 "Statistic:EnergyHomePv:Year", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
158         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_DAY, "scb:statistic:EnergyFlow",
159                 "Statistic:OwnConsumptionRate:Day", ThirdGenerationChannelDatatypes.PERCEMTAGE);
160         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_MONTH, "scb:statistic:EnergyFlow",
161                 "Statistic:OwnConsumptionRate:Month", ThirdGenerationChannelDatatypes.PERCEMTAGE);
162         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_TOTAL, "scb:statistic:EnergyFlow",
163                 "Statistic:OwnConsumptionRate:Total", ThirdGenerationChannelDatatypes.PERCEMTAGE);
164         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_YEAR, "scb:statistic:EnergyFlow",
165                 "Statistic:OwnConsumptionRate:Year", ThirdGenerationChannelDatatypes.PERCEMTAGE);
166         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_DAY, "scb:statistic:EnergyFlow",
167                 "Statistic:Yield:Day", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
168         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_MONTH, "scb:statistic:EnergyFlow",
169                 "Statistic:Yield:Month", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
170         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_TOTAL, "scb:statistic:EnergyFlow",
171                 "Statistic:Yield:Total", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
172         addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_YEAR, "scb:statistic:EnergyFlow",
173                 "Statistic:Yield:Year", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
174
175         // Plenticore Plus devices can be expanded with a battery.
176         // Additional channels become available, but the pv3 information are hidden (since the battery is attached
177         // there)
178         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_LOADING_CYCLES,
179                 "devices:local:battery", "Cycles", ThirdGenerationChannelDatatypes.INTEGER);
180         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_FULL_CHARGE_CAPACITY,
181                 "devices:local:battery", "FullChargeCap_E", ThirdGenerationChannelDatatypes.AMPERE_HOUR);
182         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_AMPERAGE, "devices:local:battery", "I",
183                 ThirdGenerationChannelDatatypes.AMPERE);
184         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_POWER, "devices:local:battery", "P",
185                 ThirdGenerationChannelDatatypes.WATT);
186         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_STATE_OF_CHARGE,
187                 "devices:local:battery", "SoC", ThirdGenerationChannelDatatypes.PERCEMTAGE);
188         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_VOLTAGE, "devices:local:battery", "U",
189                 ThirdGenerationChannelDatatypes.VOLT);
190         addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_DAY,
191                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Day",
192                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
193         addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_MONTH,
194                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Month",
195                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
196         addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_TOTAL,
197                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Total",
198                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
199         addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_YEAR,
200                 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Year",
201                 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
202         addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_HOMECONSUMPTION_FROM_BATTERY, "devices:local",
203                 "HomeBat_P", ThirdGenerationChannelDatatypes.WATT);
204         // Plenticore devices without battery have the pv3 settings available
205         addInverterChannel(allInvertersWithThreeStringsList, CHANNEL_DEVICE_LOCAL_PVSTRING_3_AMPERAGE,
206                 "devices:local:pv3", "I", ThirdGenerationChannelDatatypes.AMPERE);
207         addInverterChannel(allInvertersWithThreeStringsList, CHANNEL_DEVICE_LOCAL_PVSTRING_3_POWER, "devices:local:pv3",
208                 "P", ThirdGenerationChannelDatatypes.WATT);
209         addInverterChannel(allInvertersWithThreeStringsList, CHANNEL_DEVICE_LOCAL_PVSTRING_3_VOLTAGE,
210                 "devices:local:pv3", "U", ThirdGenerationChannelDatatypes.VOLT);
211     }
212
213     static Map<String, List<ThirdGenerationChannelMappingToWebApi>> getModuleToChannelsMappingForInverter(
214             ThirdGenerationInverterTypes inverter) {
215         Map<String, List<ThirdGenerationChannelMappingToWebApi>> results = new HashMap<>();
216         for (ThirdGenerationChannelMappingToWebApi mapping : CHANNEL_MAPPING.get(inverter)) {
217             List<ThirdGenerationChannelMappingToWebApi> channelList = null;
218             if (results.containsKey(mapping.moduleId)) {
219                 channelList = results.get(mapping.moduleId);
220             } else {
221                 channelList = new ArrayList<>();
222                 results.put(mapping.moduleId, channelList);
223             }
224             channelList.add(mapping);
225         }
226         return results;
227     }
228
229     private static void addInverterChannel(ThirdGenerationInverterTypes inverter,
230             ThirdGenerationChannelMappingToWebApi mapping) {
231         if (!CHANNEL_MAPPING.containsKey(inverter)) {
232             CHANNEL_MAPPING.put(inverter, new ArrayList<>());
233         }
234         CHANNEL_MAPPING.get(inverter).add(mapping);
235     }
236
237     private static void addInverterChannel(ThirdGenerationInverterTypes inverter, String channelUID, String moduleId,
238             String processdataId, ThirdGenerationChannelDatatypes dataType) {
239         addInverterChannel(inverter,
240                 new ThirdGenerationChannelMappingToWebApi(channelUID, moduleId, processdataId, dataType));
241     }
242
243     private static void addInverterChannel(List<ThirdGenerationInverterTypes> inverterList, String channelUID,
244             String moduleId, String processdataId, ThirdGenerationChannelDatatypes dataType) {
245         for (ThirdGenerationInverterTypes inverter : inverterList) {
246             addInverterChannel(inverter, channelUID, moduleId, processdataId, dataType);
247         }
248     }
249 }