]> git.basschouten.com Git - openhab-addons.git/blob
2a90d94c2cefee4b2b336c5fba06163b57db0b5a
[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.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_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);
178
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
181         // there)
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);
215     }
216
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);
224             } else {
225                 channelList = new ArrayList<>();
226                 results.put(mapping.moduleId, channelList);
227             }
228             channelList.add(mapping);
229         }
230         return results;
231     }
232
233     private static void addInverterChannel(ThirdGenerationInverterTypes inverter,
234             ThirdGenerationChannelMappingToWebApi mapping) {
235         if (!CHANNEL_MAPPING.containsKey(inverter)) {
236             CHANNEL_MAPPING.put(inverter, new ArrayList<>());
237         }
238         CHANNEL_MAPPING.get(inverter).add(mapping);
239     }
240
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));
245     }
246
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);
251         }
252     }
253 }