2 * Copyright (c) 2010-2021 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.kostalinverter.internal.thirdgeneration;
15 import static org.openhab.binding.kostalinverter.internal.thirdgeneration.ThirdGenerationBindingConstants.*;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.HashMap;
20 import java.util.List;
22 import java.util.stream.Collectors;
23 import java.util.stream.Stream;
26 * The {@link ThirdGenerationMappingInverterToChannel} is responsible for the management of the channels
27 * available to inverters
29 * @author René Stakemeier - Initial contribution
31 class ThirdGenerationMappingInverterToChannel {
33 private static final Map<ThirdGenerationInverterTypes, List<ThirdGenerationChannelMappingToWebApi>> CHANNEL_MAPPING = new HashMap<>();
36 * Assign the channels to the devices.
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());
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);
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
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);
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);
221 channelList = new ArrayList<>();
222 results.put(mapping.moduleId, channelList);
224 channelList.add(mapping);
229 private static void addInverterChannel(ThirdGenerationInverterTypes inverter,
230 ThirdGenerationChannelMappingToWebApi mapping) {
231 if (!CHANNEL_MAPPING.containsKey(inverter)) {
232 CHANNEL_MAPPING.put(inverter, new ArrayList<>());
234 CHANNEL_MAPPING.get(inverter).add(mapping);
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));
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);