]> git.basschouten.com Git - openhab-addons.git/blob
8fd8f22bb756632e578c27aa7b5b8f6e1801225e
[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.homematic.internal.converter.type;
14
15 import org.openhab.binding.homematic.internal.converter.ConverterException;
16 import org.openhab.binding.homematic.internal.model.HmDatapoint;
17 import org.openhab.binding.homematic.internal.model.HmInterface;
18 import org.openhab.binding.homematic.internal.type.MetadataUtils;
19 import org.openhab.core.library.types.IncreaseDecreaseType;
20 import org.openhab.core.library.types.OnOffType;
21 import org.openhab.core.library.types.PercentType;
22 import org.openhab.core.library.types.UpDownType;
23 import org.openhab.core.types.Command;
24 import org.openhab.core.types.Type;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 /**
29  * Converts between a Homematic datapoint value and an openHAB PercentType.
30  *
31  * @author Gerhard Riegler - Initial contribution
32  */
33 public class PercentTypeConverter extends AbstractTypeConverter<PercentType> {
34     private final Logger logger = LoggerFactory.getLogger(PercentTypeConverter.class);
35
36     @Override
37     protected Object commandToBinding(Command command, HmDatapoint dp) throws ConverterException {
38         if (command.getClass() == IncreaseDecreaseType.class) {
39             PercentType type = convertFromBinding(dp);
40
41             int percent = type.intValue();
42             percent += command.equals(IncreaseDecreaseType.INCREASE) ? 10 : -10;
43             percent = (percent / 10) * 10;
44             percent = Math.min(100, percent);
45             percent = Math.max(0, percent);
46             return convertToBinding(new PercentType(percent), dp);
47         } else if (command.getClass() == OnOffType.class) {
48             PercentType type = new PercentType(command.equals(OnOffType.ON) ? 100 : 0);
49             return convertToBinding(type, dp);
50         } else if (command.getClass() == UpDownType.class) {
51             return convertToBinding(command.equals(UpDownType.UP) ? PercentType.ZERO : PercentType.HUNDRED, dp);
52         } else {
53             return super.commandToBinding(command, dp);
54         }
55     }
56
57     private double getCorrectedMaxValue(HmDatapoint dp) {
58         double max = dp.getMaxValue().doubleValue();
59         return (max == 1.01 && dp.getChannel().getDevice().getHmInterface() == HmInterface.HMIP ? 1.0d : max);
60     }
61
62     @Override
63     protected boolean toBindingValidation(HmDatapoint dp, Class<? extends Type> typeClass) {
64         return dp.isNumberType() && dp.getMaxValue() != null && dp.getMinValue() != null
65                 && dp.getChannel().getType() != null && typeClass.isAssignableFrom(PercentType.class);
66     }
67
68     @Override
69     protected Object toBinding(PercentType type, HmDatapoint dp) throws ConverterException {
70         double maxValue = getCorrectedMaxValue(dp);
71         Double number = (type.doubleValue() / 100) * maxValue;
72
73         if (MetadataUtils.isRollerShutter(dp)) {
74             if (PercentType.HUNDRED.equals(type)) { // means DOWN
75                 return dp.getMinValue().doubleValue();
76             } else if (PercentType.ZERO.equals(type)) { // means UP
77                 return maxValue;
78             }
79             return maxValue - number;
80         }
81         if (number < 0.0 || number > 100.0) {
82             logger.warn("Percent value '{}' out of range, truncating value for {}", number, dp);
83             number = number < 0.0 ? 0.0 : 100.0;
84         }
85         if (dp.isIntegerType()) {
86             return number.intValue();
87         }
88         return round(number).doubleValue();
89     }
90
91     @Override
92     protected boolean fromBindingValidation(HmDatapoint dp) {
93         return dp.isNumberType() && dp.getValue() instanceof Number && dp.getMaxValue() != null
94                 && dp.getChannel().getType() != null;
95     }
96
97     @Override
98     protected PercentType fromBinding(HmDatapoint dp) throws ConverterException {
99         Double number = ((Number) dp.getValue()).doubleValue();
100         int percent = (int) (100 / getCorrectedMaxValue(dp) * number);
101         if (percent > 100) {
102             logger.warn("Percent value '{}' out of range, truncating value for {}", number, dp);
103             percent = 100;
104         }
105         if (MetadataUtils.isRollerShutter(dp)) {
106             percent = 100 - percent;
107         }
108         return new PercentType(percent);
109     }
110 }