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.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_COS_PHI, "devices:local:ac", "CosPhi",
73 ThirdGenerationChannelDatatypes.INTEGER);
74 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_FREQUENCY, "devices:local:ac", "Frequency",
75 ThirdGenerationChannelDatatypes.HERTZ);
76 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_1_CURRENT_AMPERAGE, "devices:local:ac",
77 "L1_I", ThirdGenerationChannelDatatypes.AMPERE);
78 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_1_CURRENT_POWER, "devices:local:ac", "L1_P",
79 ThirdGenerationChannelDatatypes.WATT);
80 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_1_CURRENT_VOLTAGE, "devices:local:ac",
81 "L1_U", ThirdGenerationChannelDatatypes.VOLT);
82 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_2_CURRENT_AMPERAGE, "devices:local:ac",
83 "L2_I", ThirdGenerationChannelDatatypes.AMPERE);
84 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_2_CURRENT_POWER, "devices:local:ac", "L2_P",
85 ThirdGenerationChannelDatatypes.WATT);
86 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_2_CURRENT_VOLTAGE, "devices:local:ac",
87 "L2_U", ThirdGenerationChannelDatatypes.VOLT);
88 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_3_CURRENT_AMPERAGE, "devices:local:ac",
89 "L3_I", ThirdGenerationChannelDatatypes.AMPERE);
90 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_3_CURRENT_POWER, "devices:local:ac", "L3_P",
91 ThirdGenerationChannelDatatypes.WATT);
92 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_PHASE_3_CURRENT_VOLTAGE, "devices:local:ac",
93 "L3_U", ThirdGenerationChannelDatatypes.VOLT);
94 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_AC_CURRENT_POWER, "devices:local:ac", "P",
95 ThirdGenerationChannelDatatypes.WATT);
96 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_1_AMPERAGE, "devices:local:pv1", "I",
97 ThirdGenerationChannelDatatypes.AMPERE);
98 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_1_POWER, "devices:local:pv1", "P",
99 ThirdGenerationChannelDatatypes.WATT);
100 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_1_VOLTAGE, "devices:local:pv1", "U",
101 ThirdGenerationChannelDatatypes.VOLT);
102 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_2_AMPERAGE, "devices:local:pv2", "I",
103 ThirdGenerationChannelDatatypes.AMPERE);
104 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_2_POWER, "devices:local:pv2", "P",
105 ThirdGenerationChannelDatatypes.WATT);
106 addInverterChannel(allInvertersList, CHANNEL_DEVICE_LOCAL_PVSTRING_2_VOLTAGE, "devices:local:pv2", "U",
107 ThirdGenerationChannelDatatypes.VOLT);
108 addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_ERROR_COUNT_MC, "scb:event", "ErrMc",
109 ThirdGenerationChannelDatatypes.INTEGER);
110 addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_ERROR_COUNT_SFH, "scb:event", "ErrSFH",
111 ThirdGenerationChannelDatatypes.INTEGER);
112 addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_ERROR_COUNT_SCB, "scb:event", "Event:ActiveErrorCnt",
113 ThirdGenerationChannelDatatypes.INTEGER);
114 addInverterChannel(allInvertersList, CHANNEL_SCB_EVENT_WARNING_COUNT_SCB, "scb:event", "Event:ActiveWarningCnt",
115 ThirdGenerationChannelDatatypes.INTEGER);
116 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_DAY, "scb:statistic:EnergyFlow",
117 "Statistic:Autarky:Day", ThirdGenerationChannelDatatypes.PERCEMTAGE);
118 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_MONTH, "scb:statistic:EnergyFlow",
119 "Statistic:Autarky:Month", ThirdGenerationChannelDatatypes.PERCEMTAGE);
120 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_TOTAL, "scb:statistic:EnergyFlow",
121 "Statistic:Autarky:Total", ThirdGenerationChannelDatatypes.PERCEMTAGE);
122 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_AUTARKY_YEAR, "scb:statistic:EnergyFlow",
123 "Statistic:Autarky:Year", ThirdGenerationChannelDatatypes.PERCEMTAGE);
124 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_DAY, "scb:statistic:EnergyFlow",
125 "Statistic:CO2Saving:Day", ThirdGenerationChannelDatatypes.KILOGRAM);
126 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_MONTH, "scb:statistic:EnergyFlow",
127 "Statistic:CO2Saving:Month", ThirdGenerationChannelDatatypes.KILOGRAM);
128 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_TOTAL, "scb:statistic:EnergyFlow",
129 "Statistic:CO2Saving:Total", ThirdGenerationChannelDatatypes.KILOGRAM);
130 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_CO2SAVING_YEAR, "scb:statistic:EnergyFlow",
131 "Statistic:CO2Saving:Year", ThirdGenerationChannelDatatypes.KILOGRAM);
132 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_DAY, "scb:statistic:EnergyFlow",
133 "Statistic:EnergyHome:Day", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
134 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_MONTH, "scb:statistic:EnergyFlow",
135 "Statistic:EnergyHome:Month", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
136 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_TOTAL, "scb:statistic:EnergyFlow",
137 "Statistic:EnergyHome:Total", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
138 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_YEAR, "scb:statistic:EnergyFlow",
139 "Statistic:EnergyHome:Year", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
140 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_DAY,
141 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Day",
142 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
143 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_MONTH,
144 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Month",
145 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
146 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_TOTAL,
147 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Total",
148 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
149 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_GRID_YEAR,
150 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeGrid:Year",
151 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
152 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_DAY, "scb:statistic:EnergyFlow",
153 "Statistic:EnergyHomePv:Day", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
154 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_MONTH,
155 "scb:statistic:EnergyFlow", "Statistic:EnergyHomePv:Month",
156 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
157 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_TOTAL,
158 "scb:statistic:EnergyFlow", "Statistic:EnergyHomePv:Total",
159 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
160 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_PV_YEAR, "scb:statistic:EnergyFlow",
161 "Statistic:EnergyHomePv:Year", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
162 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_DAY, "scb:statistic:EnergyFlow",
163 "Statistic:OwnConsumptionRate:Day", ThirdGenerationChannelDatatypes.PERCEMTAGE);
164 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_MONTH, "scb:statistic:EnergyFlow",
165 "Statistic:OwnConsumptionRate:Month", ThirdGenerationChannelDatatypes.PERCEMTAGE);
166 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_TOTAL, "scb:statistic:EnergyFlow",
167 "Statistic:OwnConsumptionRate:Total", ThirdGenerationChannelDatatypes.PERCEMTAGE);
168 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_OWNCONSUMPTION_RATE_YEAR, "scb:statistic:EnergyFlow",
169 "Statistic:OwnConsumptionRate:Year", ThirdGenerationChannelDatatypes.PERCEMTAGE);
170 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_DAY, "scb:statistic:EnergyFlow",
171 "Statistic:Yield:Day", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
172 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_MONTH, "scb:statistic:EnergyFlow",
173 "Statistic:Yield:Month", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
174 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_TOTAL, "scb:statistic:EnergyFlow",
175 "Statistic:Yield:Total", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
176 addInverterChannel(allInvertersList, CHANNEL_STATISTIC_YIELD_YEAR, "scb:statistic:EnergyFlow",
177 "Statistic:Yield:Year", ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
179 // Plenticore Plus devices can be expanded with a battery.
180 // Additional channels become available, but the pv3 information are hidden (since the battery is attached
182 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_LOADING_CYCLES,
183 "devices:local:battery", "Cycles", ThirdGenerationChannelDatatypes.INTEGER);
184 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_FULL_CHARGE_CAPACITY,
185 "devices:local:battery", "FullChargeCap_E", ThirdGenerationChannelDatatypes.AMPERE_HOUR);
186 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_AMPERAGE, "devices:local:battery", "I",
187 ThirdGenerationChannelDatatypes.AMPERE);
188 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_POWER, "devices:local:battery", "P",
189 ThirdGenerationChannelDatatypes.WATT);
190 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_STATE_OF_CHARGE,
191 "devices:local:battery", "SoC", ThirdGenerationChannelDatatypes.PERCEMTAGE);
192 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_BATTERY_VOLTAGE, "devices:local:battery", "U",
193 ThirdGenerationChannelDatatypes.VOLT);
194 addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_DAY,
195 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Day",
196 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
197 addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_MONTH,
198 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Month",
199 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
200 addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_TOTAL,
201 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Total",
202 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
203 addInverterChannel(allBatteryInvertersList, CHANNEL_STATISTIC_HOMECONSUMPTION_FROM_BATTERIE_YEAR,
204 "scb:statistic:EnergyFlow", "Statistic:EnergyHomeBat:Year",
205 ThirdGenerationChannelDatatypes.KILOWATT_HOUR);
206 addInverterChannel(allBatteryInvertersList, CHANNEL_DEVICE_LOCAL_HOMECONSUMPTION_FROM_BATTERY, "devices:local",
207 "HomeBat_P", ThirdGenerationChannelDatatypes.WATT);
208 // Plenticore devices without battery have the pv3 settings available
209 addInverterChannel(allInvertersWithThreeStringsList, CHANNEL_DEVICE_LOCAL_PVSTRING_3_AMPERAGE,
210 "devices:local:pv3", "I", ThirdGenerationChannelDatatypes.AMPERE);
211 addInverterChannel(allInvertersWithThreeStringsList, CHANNEL_DEVICE_LOCAL_PVSTRING_3_POWER, "devices:local:pv3",
212 "P", ThirdGenerationChannelDatatypes.WATT);
213 addInverterChannel(allInvertersWithThreeStringsList, CHANNEL_DEVICE_LOCAL_PVSTRING_3_VOLTAGE,
214 "devices:local:pv3", "U", ThirdGenerationChannelDatatypes.VOLT);
217 static Map<String, List<ThirdGenerationChannelMappingToWebApi>> getModuleToChannelsMappingForInverter(
218 ThirdGenerationInverterTypes inverter) {
219 Map<String, List<ThirdGenerationChannelMappingToWebApi>> results = new HashMap<>();
220 for (ThirdGenerationChannelMappingToWebApi mapping : CHANNEL_MAPPING.get(inverter)) {
221 List<ThirdGenerationChannelMappingToWebApi> channelList = null;
222 if (results.containsKey(mapping.moduleId)) {
223 channelList = results.get(mapping.moduleId);
225 channelList = new ArrayList<>();
226 results.put(mapping.moduleId, channelList);
228 channelList.add(mapping);
233 private static void addInverterChannel(ThirdGenerationInverterTypes inverter,
234 ThirdGenerationChannelMappingToWebApi mapping) {
235 if (!CHANNEL_MAPPING.containsKey(inverter)) {
236 CHANNEL_MAPPING.put(inverter, new ArrayList<>());
238 CHANNEL_MAPPING.get(inverter).add(mapping);
241 private static void addInverterChannel(ThirdGenerationInverterTypes inverter, String channelUID, String moduleId,
242 String processdataId, ThirdGenerationChannelDatatypes dataType) {
243 addInverterChannel(inverter,
244 new ThirdGenerationChannelMappingToWebApi(channelUID, moduleId, processdataId, dataType));
247 private static void addInverterChannel(List<ThirdGenerationInverterTypes> inverterList, String channelUID,
248 String moduleId, String processdataId, ThirdGenerationChannelDatatypes dataType) {
249 for (ThirdGenerationInverterTypes inverter : inverterList) {
250 addInverterChannel(inverter, channelUID, moduleId, processdataId, dataType);