2 * Copyright (c) 2010-2024 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.freeathomesystem.internal.datamodel;
15 import static org.openhab.binding.freeathomesystem.internal.datamodel.FreeAtHomeDatapoint.*;
17 import org.eclipse.jdt.annotation.NonNullByDefault;
18 import org.eclipse.jdt.annotation.Nullable;
19 import org.openhab.binding.freeathomesystem.internal.util.FreeAtHomeGeneralException;
20 import org.openhab.binding.freeathomesystem.internal.util.PidTranslationUtils;
21 import org.openhab.binding.freeathomesystem.internal.valuestateconverter.BooleanValueStateConverter;
22 import org.openhab.binding.freeathomesystem.internal.valuestateconverter.DecimalValueStateConverter;
23 import org.openhab.binding.freeathomesystem.internal.valuestateconverter.ShuttercontrolValueStateConverter;
24 import org.openhab.binding.freeathomesystem.internal.valuestateconverter.ValueStateConverter;
25 import org.openhab.core.library.CoreItemFactory;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
29 import com.google.gson.JsonObject;
33 * @author Andras Uhrin - Initial contribution
37 public class FreeAtHomeDatapointGroup {
39 private final Logger logger = LoggerFactory.getLogger(FreeAtHomeDatapointGroup.class);
41 public enum DatapointGroupDirection {
48 private DatapointGroupDirection datapointGroupDirection;
49 private int pairingId;
51 private String functionString = "";
52 private @Nullable FreeAtHomeDatapoint inputDatapoint;
53 private @Nullable FreeAtHomeDatapoint outputDatapoint;
55 FreeAtHomeDatapointGroup() {
56 datapointGroupDirection = DatapointGroupDirection.UNDEFINED;
57 inputDatapoint = null;
58 outputDatapoint = null;
61 boolean addDatapointToGroup(DatapointDirection direction, int neededPairingId, String channelId,
62 JsonObject jsonObjectOfChannel) {
63 FreeAtHomeDatapoint newDatapoint = new FreeAtHomeDatapoint();
65 DatapointDirection resultingDirection = newDatapoint.searchForDatapoint(direction, neededPairingId, channelId,
68 if (resultingDirection != DatapointDirection.UNKNOWN) {
69 switch (resultingDirection) {
71 inputDatapoint = newDatapoint;
73 pairingId = neededPairingId;
78 outputDatapoint = newDatapoint;
80 if (inputDatapoint == null) {
81 pairingId = neededPairingId;
93 if (inputDatapoint != null && outputDatapoint != null) {
94 datapointGroupDirection = DatapointGroupDirection.INPUTOUTPUT;
96 if (inputDatapoint == null && outputDatapoint != null) {
97 datapointGroupDirection = DatapointGroupDirection.OUTPUT;
99 if (inputDatapoint != null && outputDatapoint == null) {
100 datapointGroupDirection = DatapointGroupDirection.INPUT;
102 datapointGroupDirection = DatapointGroupDirection.UNDEFINED;
107 return resultingDirection != DatapointDirection.UNKNOWN;
110 public void applyChangesForVirtualDevice() {
111 // The input and output datapoints are meant from the device point of view. Because the virtual devices are
112 // outside of the free@home system the input and output datapoint must be switched
114 FreeAtHomeDatapoint localDatapoint = inputDatapoint;
116 inputDatapoint = outputDatapoint;
117 outputDatapoint = localDatapoint;
119 if (inputDatapoint != null && outputDatapoint != null) {
120 datapointGroupDirection = DatapointGroupDirection.INPUTOUTPUT;
122 if (inputDatapoint == null && outputDatapoint != null) {
123 datapointGroupDirection = DatapointGroupDirection.OUTPUT;
125 if (inputDatapoint != null && outputDatapoint == null) {
126 datapointGroupDirection = DatapointGroupDirection.INPUT;
128 datapointGroupDirection = DatapointGroupDirection.UNDEFINED;
136 public @Nullable FreeAtHomeDatapoint getInputDatapoint() {
137 return inputDatapoint;
140 public @Nullable FreeAtHomeDatapoint getOutputDatapoint() {
141 return outputDatapoint;
144 public DatapointGroupDirection getDirection() {
145 return datapointGroupDirection;
148 public boolean isDecimal() throws FreeAtHomeGeneralException {
149 return PidTranslationUtils.PID_VALUETYPE_DECIMAL
150 .equals(PidTranslationUtils.getValueTypeForPairingId(String.format("0x%04X", pairingId)));
153 public boolean isInteger() throws FreeAtHomeGeneralException {
154 return PidTranslationUtils.PID_VALUETYPE_INTEGER
155 .equals(PidTranslationUtils.getValueTypeForPairingId(String.format("0x%04X", pairingId)));
158 public boolean isReadOnly() {
159 return (DatapointGroupDirection.INPUTOUTPUT == datapointGroupDirection) ? false
160 : ((DatapointGroupDirection.INPUT == datapointGroupDirection) ? false : true);
163 public int getMax() throws FreeAtHomeGeneralException {
164 return PidTranslationUtils.getMax(String.format("0x%04X", pairingId));
167 public int getMin() throws FreeAtHomeGeneralException {
168 return PidTranslationUtils.getMin(String.format("0x%04X", pairingId));
171 public String getLabel() throws FreeAtHomeGeneralException {
172 return PidTranslationUtils.getShortTextForPairingId(String.format("0x%04X", pairingId));
175 public String getDescription() throws FreeAtHomeGeneralException {
176 return PidTranslationUtils.getDescriptionTextForPairingId(String.format("0x%04X", pairingId));
179 public String getValueType() throws FreeAtHomeGeneralException {
180 return PidTranslationUtils.getValueTypeForPairingId(String.format("0x%04X", pairingId));
183 public String getTypePattern() throws FreeAtHomeGeneralException {
186 functionString = PidTranslationUtils.getValueTypeForPairingId(String.format("0x%04X", pairingId));
188 switch (functionString) {
189 case PidTranslationUtils.PID_VALUETYPE_DECIMAL:
192 case PidTranslationUtils.PID_VALUETYPE_INTEGER:
197 logger.debug("Type pattern not found for PairingID {} - using default",
198 String.format("0x%04X", pairingId));
205 public ValueStateConverter getValueStateConverter() throws FreeAtHomeGeneralException {
206 ValueStateConverter valueStateConverter = new BooleanValueStateConverter();
208 functionString = PidTranslationUtils.getValueTypeForPairingId(String.format("0x%04X", pairingId));
210 switch (functionString) {
211 case PidTranslationUtils.PID_VALUETYPE_BOOLEAN:
212 valueStateConverter = new BooleanValueStateConverter();
214 case PidTranslationUtils.PID_VALUETYPE_DECIMAL:
215 case PidTranslationUtils.PID_VALUETYPE_INTEGER:
216 valueStateConverter = new DecimalValueStateConverter();
218 case PidTranslationUtils.PID_VALUETYPE_STRING:
220 case PidTranslationUtils.PID_VALUETYPE_SHUTTERMOVEMENT:
221 valueStateConverter = new ShuttercontrolValueStateConverter();
224 valueStateConverter = new DecimalValueStateConverter();
225 logger.debug("Value converter not found for PairingID {} - using default",
226 String.format("0x%04X", pairingId));
230 return valueStateConverter;
233 public String getOpenHabItemType() throws FreeAtHomeGeneralException {
234 String itemTypeString = "";
236 functionString = PidTranslationUtils.getValueTypeForPairingId(String.format("0x%04X", pairingId));
238 switch (functionString) {
239 case PidTranslationUtils.PID_VALUETYPE_BOOLEAN:
240 itemTypeString = CoreItemFactory.SWITCH;
242 case PidTranslationUtils.PID_VALUETYPE_DECIMAL:
243 case PidTranslationUtils.PID_VALUETYPE_INTEGER:
244 itemTypeString = CoreItemFactory.NUMBER;
246 case PidTranslationUtils.PID_VALUETYPE_SHUTTERMOVEMENT:
247 itemTypeString = CoreItemFactory.ROLLERSHUTTER;
250 itemTypeString = CoreItemFactory.NUMBER;
251 logger.debug("Item type constant not found for PairingID {} - using default",
252 String.format("0x%04X", pairingId));
256 return itemTypeString;
259 public String getOpenHabCategory() throws FreeAtHomeGeneralException {
260 return PidTranslationUtils.getCategoryForPairingId(String.format("0x%04X", pairingId));