Search in sources :

Example 1 with DPTXlator1BitControlled

use of tuwien.auto.calimero.dptxlator.DPTXlator1BitControlled in project openhab1-addons by openhab.

the class KNXCoreTypeMapper method toType.

/*
     * (non-Javadoc)
     *
     * @see org.openhab.binding.knx.config.KNXTypeMapper#toType(tuwien.auto.calimero.datapoint.Datapoint, byte[])
     */
@Override
public Type toType(Datapoint datapoint, byte[] data) {
    try {
        DPTXlator translator = TranslatorTypes.createTranslator(datapoint.getMainNumber(), datapoint.getDPT());
        translator.setData(data);
        String value = translator.getValue();
        String id = translator.getType().getID();
        logger.trace("toType datapoint DPT = " + datapoint.getDPT());
        int mainNumber = getMainNumber(id);
        if (mainNumber == -1) {
            logger.debug("toType: couldn't identify mainnumber in dptID: {}.", id);
            return null;
        }
        int subNumber = getSubNumber(id);
        if (subNumber == -1) {
            logger.debug("toType: couldn't identify sub number in dptID: {}.", id);
            return null;
        }
        /*
             * Following code section deals with specific mapping of values from KNX to openHAB types were the String
             * received from the DPTXlator is not sufficient to set the openHAB type or has bugs
             */
        switch(mainNumber) {
            case 1:
                DPTXlatorBoolean translatorBoolean = (DPTXlatorBoolean) translator;
                switch(subNumber) {
                    case 8:
                        return translatorBoolean.getValueBoolean() ? UpDownType.DOWN : UpDownType.UP;
                    case 9:
                        return translatorBoolean.getValueBoolean() ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
                    case 10:
                        return translatorBoolean.getValueBoolean() ? StopMoveType.MOVE : StopMoveType.STOP;
                    case 19:
                        return translatorBoolean.getValueBoolean() ? OpenClosedType.OPEN : OpenClosedType.CLOSED;
                    case 22:
                        return DecimalType.valueOf(translatorBoolean.getValueBoolean() ? "1" : "0");
                    default:
                        return translatorBoolean.getValueBoolean() ? OnOffType.ON : OnOffType.OFF;
                }
            case 2:
                DPTXlator1BitControlled translator1BitControlled = (DPTXlator1BitControlled) translator;
                int decValue = (translator1BitControlled.getControlBit() ? 2 : 0) + (translator1BitControlled.getValueBit() ? 1 : 0);
                return new DecimalType(decValue);
            case 3:
                DPTXlator3BitControlled translator3BitControlled = (DPTXlator3BitControlled) translator;
                if (translator3BitControlled.getStepCode() == 0) {
                    /*
                         * there is no STOP for a IncreaseDecreaseType, so we are just using an INCREASE.
                         * It is up to the binding to recognize that a start/stop-dimming is in progress and
                         * stop the dimming accordingly.
                         */
                    logger.debug("toType: KNX DPT_Control_Dimming: break received.");
                    return IncreaseDecreaseType.INCREASE;
                }
                switch(subNumber) {
                    case 7:
                        return translator3BitControlled.getControlBit() ? IncreaseDecreaseType.INCREASE : IncreaseDecreaseType.DECREASE;
                    case 8:
                        return translator3BitControlled.getControlBit() ? UpDownType.DOWN : UpDownType.UP;
                }
            case 14:
                /*
                     * FIXME: Workaround for a bug in Calimero / Openhab DPTXlator4ByteFloat.makeString(): is using a
                     * locale when
                     * translating a Float to String. It could happen the a ',' is used as separator, such as
                     * 3,14159E20.
                     * Openhab's DecimalType expects this to be in US format and expects '.': 3.14159E20.
                     * There is no issue with DPTXlator2ByteFloat since calimero is using a non-localized translation
                     * there.
                     */
                DPTXlator4ByteFloat translator4ByteFloat = (DPTXlator4ByteFloat) translator;
                Float f = translator4ByteFloat.getValueFloat();
                if (Math.abs(f) < 100000) {
                    value = String.valueOf(f);
                } else {
                    NumberFormat dcf = NumberFormat.getInstance(Locale.US);
                    if (dcf instanceof DecimalFormat) {
                        ((DecimalFormat) dcf).applyPattern("0.#####E0");
                    }
                    value = dcf.format(f);
                }
                break;
            case 18:
                DPTXlatorSceneControl translatorSceneControl = (DPTXlatorSceneControl) translator;
                int decimalValue = translatorSceneControl.getSceneNumber();
                if (value.startsWith("learn")) {
                    decimalValue += 0x80;
                }
                value = String.valueOf(decimalValue);
                break;
            case 19:
                DPTXlatorDateTime translatorDateTime = (DPTXlatorDateTime) translator;
                if (translatorDateTime.isFaultyClock()) {
                    // Not supported: faulty clock
                    logger.debug("toType: KNX clock msg ignored: clock faulty bit set, which is not supported");
                    return null;
                } else if (!translatorDateTime.isValidField(DPTXlatorDateTime.YEAR) && translatorDateTime.isValidField(DPTXlatorDateTime.DATE)) {
                    // Not supported: "/1/1" (month and day without year)
                    logger.debug("toType: KNX clock msg ignored: no year, but day and month, which is not supported");
                    return null;
                } else if (translatorDateTime.isValidField(DPTXlatorDateTime.YEAR) && !translatorDateTime.isValidField(DPTXlatorDateTime.DATE)) {
                    // Not supported: "1900" (year without month and day)
                    logger.debug("toType: KNX clock msg ignored: no day and month, but year, which is not supported");
                    return null;
                } else if (!translatorDateTime.isValidField(DPTXlatorDateTime.YEAR) && !translatorDateTime.isValidField(DPTXlatorDateTime.DATE) && !translatorDateTime.isValidField(DPTXlatorDateTime.TIME)) {
                    // Not supported: No year, no date and no time
                    logger.debug("toType: KNX clock msg ignored: no day and month or year, which is not supported");
                    return null;
                }
                Calendar cal = Calendar.getInstance();
                if (translatorDateTime.isValidField(DPTXlatorDateTime.YEAR) && !translatorDateTime.isValidField(DPTXlatorDateTime.TIME)) {
                    // Pure date format, no time information
                    cal.setTimeInMillis(translatorDateTime.getValueMilliseconds());
                    value = new SimpleDateFormat(DateTimeType.DATE_PATTERN).format(cal.getTime());
                    return DateTimeType.valueOf(value);
                } else if (!translatorDateTime.isValidField(DPTXlatorDateTime.YEAR) && translatorDateTime.isValidField(DPTXlatorDateTime.TIME)) {
                    // Pure time format, no date information
                    cal.clear();
                    cal.set(Calendar.HOUR_OF_DAY, translatorDateTime.getHour());
                    cal.set(Calendar.MINUTE, translatorDateTime.getMinute());
                    cal.set(Calendar.SECOND, translatorDateTime.getSecond());
                    value = new SimpleDateFormat(DateTimeType.DATE_PATTERN).format(cal.getTime());
                    return DateTimeType.valueOf(value);
                } else if (translatorDateTime.isValidField(DPTXlatorDateTime.YEAR) && translatorDateTime.isValidField(DPTXlatorDateTime.TIME)) {
                    // Date format and time information
                    cal.setTimeInMillis(translatorDateTime.getValueMilliseconds());
                    value = new SimpleDateFormat(DateTimeType.DATE_PATTERN).format(cal.getTime());
                    return DateTimeType.valueOf(value);
                }
                break;
        }
        Class<? extends Type> typeClass = toTypeClass(id);
        if (typeClass == null) {
            return null;
        }
        if (typeClass.equals(PercentType.class)) {
            return PercentType.valueOf(value.split(" ")[0]);
        }
        if (typeClass.equals(DecimalType.class)) {
            return DecimalType.valueOf(value.split(" ")[0]);
        }
        if (typeClass.equals(StringType.class)) {
            return StringType.valueOf(value);
        }
        if (typeClass.equals(DateTimeType.class)) {
            String date = formatDateTime(value, datapoint.getDPT());
            if ((date == null) || (date.isEmpty())) {
                logger.debug("toType: KNX clock msg ignored: date object null or empty {}.", date);
                return null;
            } else {
                return DateTimeType.valueOf(date);
            }
        }
        if (typeClass.equals(HSBType.class)) {
            // value has format of "r:<red value> g:<green value> b:<blue value>"
            int r = Integer.parseInt(value.split(" ")[0].split(":")[1]);
            int g = Integer.parseInt(value.split(" ")[1].split(":")[1]);
            int b = Integer.parseInt(value.split(" ")[2].split(":")[1]);
            Color color = new Color(r, g, b);
            return new HSBType(color);
        }
    } catch (KNXFormatException kfe) {
        logger.info("Translator couldn't parse data for datapoint type '{}' (KNXFormatException).", datapoint.getDPT());
    } catch (KNXIllegalArgumentException kiae) {
        logger.info("Translator couldn't parse data for datapoint type '{}' (KNXIllegalArgumentException).", datapoint.getDPT());
    } catch (KNXException e) {
        logger.warn("Failed creating a translator for datapoint type '{}'.", datapoint.getDPT(), e);
    }
    return null;
}
Also used : KNXException(tuwien.auto.calimero.exception.KNXException) DPTXlatorDateTime(tuwien.auto.calimero.dptxlator.DPTXlatorDateTime) KNXIllegalArgumentException(tuwien.auto.calimero.exception.KNXIllegalArgumentException) DecimalFormat(java.text.DecimalFormat) Calendar(java.util.Calendar) Color(java.awt.Color) DPTXlatorString(tuwien.auto.calimero.dptxlator.DPTXlatorString) Datapoint(tuwien.auto.calimero.datapoint.Datapoint) DPTXlatorBoolean(tuwien.auto.calimero.dptxlator.DPTXlatorBoolean) DPTXlator2ByteFloat(tuwien.auto.calimero.dptxlator.DPTXlator2ByteFloat) DPTXlator4ByteFloat(tuwien.auto.calimero.dptxlator.DPTXlator4ByteFloat) DPTXlatorSceneControl(tuwien.auto.calimero.dptxlator.DPTXlatorSceneControl) DPTXlator(tuwien.auto.calimero.dptxlator.DPTXlator) DecimalType(org.openhab.core.library.types.DecimalType) DPTXlator3BitControlled(tuwien.auto.calimero.dptxlator.DPTXlator3BitControlled) DPTXlator4ByteFloat(tuwien.auto.calimero.dptxlator.DPTXlator4ByteFloat) KNXFormatException(tuwien.auto.calimero.exception.KNXFormatException) DPTXlator1BitControlled(tuwien.auto.calimero.dptxlator.DPTXlator1BitControlled) SimpleDateFormat(java.text.SimpleDateFormat) HSBType(org.openhab.core.library.types.HSBType) NumberFormat(java.text.NumberFormat)

Aggregations

Color (java.awt.Color)1 DecimalFormat (java.text.DecimalFormat)1 NumberFormat (java.text.NumberFormat)1 SimpleDateFormat (java.text.SimpleDateFormat)1 Calendar (java.util.Calendar)1 DecimalType (org.openhab.core.library.types.DecimalType)1 HSBType (org.openhab.core.library.types.HSBType)1 Datapoint (tuwien.auto.calimero.datapoint.Datapoint)1 DPTXlator (tuwien.auto.calimero.dptxlator.DPTXlator)1 DPTXlator1BitControlled (tuwien.auto.calimero.dptxlator.DPTXlator1BitControlled)1 DPTXlator2ByteFloat (tuwien.auto.calimero.dptxlator.DPTXlator2ByteFloat)1 DPTXlator3BitControlled (tuwien.auto.calimero.dptxlator.DPTXlator3BitControlled)1 DPTXlator4ByteFloat (tuwien.auto.calimero.dptxlator.DPTXlator4ByteFloat)1 DPTXlatorBoolean (tuwien.auto.calimero.dptxlator.DPTXlatorBoolean)1 DPTXlatorDateTime (tuwien.auto.calimero.dptxlator.DPTXlatorDateTime)1 DPTXlatorSceneControl (tuwien.auto.calimero.dptxlator.DPTXlatorSceneControl)1 DPTXlatorString (tuwien.auto.calimero.dptxlator.DPTXlatorString)1 KNXException (tuwien.auto.calimero.exception.KNXException)1 KNXFormatException (tuwien.auto.calimero.exception.KNXFormatException)1 KNXIllegalArgumentException (tuwien.auto.calimero.exception.KNXIllegalArgumentException)1